Как с CASE проверить условие по значениям в разных строках?
Есть такая таблица:
|START_DATE | CLIENT_ID | ACTIVE|
|-------------|-----------|-------|
|06.01.2021 | 33270524| 1|
|06.01.2021 | 436673200| 1|
|06.01.2021 | 125182522| 1|
|06.01.2021 | 127406386| 1|
|06.01.2021 | 127407079| 1|
|06.01.2021 | 127424573| 1|
|06.01.2021 | 128387226| 1|
|06.01.2021 | 128387876| 1|
|06.01.2021 | 128876323| 1|
|06.01.2021 | 128876751| 1|
|06.01.2021 | 129398251| 1|
|06.01.2021 | 132281879| 1|
|06.01.2021 | 132411175| 1|
|06.01.2021 | 132545358| 1|
Нужно проверить следующее условие: если у пользователя в дату за прошлый месяц start_date - 30 был статус active = 1, а на момент start_date active = 0, то присвоить значение 1, иначе - 0.
Как это можно реализовать через CASE?
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
На таких данных:
CLIENT_ID START_DATE ACTIVE
---------- ------------------- ----------
1 2021-01-30 00:00:00 1
1 2021-03-01 00:00:00 1
2 2021-04-03 00:00:00 1
2 2021-05-03 00:00:00 0
3 2021-05-27 00:00:00 1
3 2021-06-28 00:00:00 0
Ожидаю, что только клиент 2 имел active=1 ровно месяц назад.
Так оно и есть (на db<>fiddle):
select t1.*,
case when t1.active = 0 and t2.start_date is not null then 1 else 0 end newactive
from t t1
left join t t2 on (
t2.client_id = t1.client_id and
t2.start_date = add_months (t1.start_date, -1));
CLIENT_ID START_DATE ACTIVE NEWACTIVE
---------- ------------------- ---------- ----------
2 2021-05-03 00:00:00 0 1
3 2021-05-27 00:00:00 1 0
1 2021-03-01 00:00:00 1 0
3 2021-06-28 00:00:00 0 0
2 2021-04-03 00:00:00 1 0
1 2021-01-30 00:00:00 1 0
если у пользователя в дату за прошлый месяц start_date - 30
Замените в запросе выше add_months на t1.start_date-30, если действительно в месяце всегда 30 дней.