Определите минимальную дату из последовательных вхождений - PullRequest
1 голос
/ 25 февраля 2020

У меня есть таблица, которая содержит следующие столбцы: Дата, Клиент, Активный флаг. Мне нужно добавить четвертый столбец под названием Start. Столбец Start должен возвращать первую дату, когда клиент был активен, на основе последовательных активных флагов.

This image

показывает три столбца, которые у меня есть в настоящее время, и результаты, которые я получу sh до вернитесь в столбец Start.

Ваше понимание того, как должен выглядеть мой код SQL для достижения этой цели, будет оценено. Спасибо !!

1 Ответ

0 голосов
/ 25 февраля 2020

Вы можете сделать это без подзапросов, если я предполагаю одну дату в месяц для каждого клиента:

select t.*,
       (case when activeflag = 1
             then coalesce(max(case when activeflag = 0 then date end) over (partition by customer order by date) + interval '1 month',
                           min(case when activeflag = 1 then date end) over (partition by customer)
                          )
        end) as start
from t;

Однако подзапросы могут упростить эту задачу. Вы можете рассматривать это как проблему пробелов и островков:

select t.*,
       (case when activeflag = 1
             then min(date) over (partition by customerid, seqnum - seqnum_a)
        end) as start
from (select t.*,
             row_number() over (partition by customerid order by date) as seqnum,
             row_number() over (partition by customerid, activeflag order by date) as seqnum_a
      from t
     ) t
...