Как считать даты подряд, используя Netezza - PullRequest
0 голосов
/ 24 февраля 2020

Мне нужно считать дни подряд, чтобы определить мои когорты. У меня есть таблица, которая выглядит следующим образом:

pat_id         admin_date
----------------------------
1              3/10/2019
1              3/11/2019
1              3/23/2019
1              3/24/2019
1              3/25/2019
2              12/26/2017
2              2/27/2019
2              3/16/2019
2              3/17/2019 

Я хочу, например, вывод:

pat_id         admin_date      consecutive
--------------------------------------------
1              3/10/2019            1
1              3/11/2019            2
1              3/23/2019            1
1              3/24/2019            2
1              3/25/2019            3
2              12/26/2017           1
2              2/27/2019            1
2              3/16/2019            1
2              3/17/2019            2

, чтобы я мог использовать значение этих дней подряд (для pat_id) для фильтрации для моей когорты , Я видел несколько постов, которые предлагали использовать DateDiff / DateAdd с row_number, например:

datediff(day, -row_number() over (partition by mrn order by admin_date), admin_date) 

, но функции datediff / dateadd не будут работать на Netezza ...

Ближайший I До сих пор было:

select row_number() over (partition by mrn order by administration_date) as consecutive 

, который не распознает разрыв между датами и возвращает такой вывод:

pat_id         admin_date      consecutive
--------------------------------------------
1              3/10/2019            1
1              3/11/2019            2
1              3/23/2019            3
1              3/24/2019            4
1              3/25/2019            5
2              12/26/2017           1
2              2/27/2019            2
2              3/16/2019            3
2              3/17/2019            4

Кто-нибудь знает, как справиться с этим?

1 Ответ

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

Используйте lag(), чтобы увидеть, где начинаются группы, и кумулятивную сумму, чтобы определить группу. Остальное просто row_number():

select t.*,
       row_number() over (partition by pat_id, grp order by admin_date) as consecutive
from (select t.*,
             sum( case when prev_ad = admin_date - interval '1 day' then 0 else 1 end) over
                 (partition by pat_id order by admin_date) as grp
      from (select t.*, 
                   lag(admin_date) over (partition by pat_id order by admin_date) as prev_ad
            from t
           ) t
     )t ;
...