Как с 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 дней.

→ Ссылка