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

Я пытаюсь сгруппировать даты подряд, посчитать даты подряд и использовать это количество в качестве фильтра.

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

pat_id   admin_dates   admin_grp    daily_admin    
-------------------------------------------------
1        08/20/2018        1          2 doses
1        08/21/2018        1          3 doses
1        08/22/2018        1          1 doses
1        10/05/2018        2          3 doses
1        12/10/2018        3          4 doses
2        01/05/2019        1          1 doses
2        02/10/2019        2          2 doses
2        02/11/2019        2          2 doses

где admin_grp группирует последовательные даты за pat_id.

Я хочу исключить все строки, которые имеют менее 3 последовательных дат для одного и того же pat_id. В этом примере только условие pat_id = 1 and admin_grp = 1 имеет 3 последовательные даты, которые я хотел бы видеть в результате. Мой желаемый результат будет:

pat_id   admin_dates   admin_grp    daily_admin    
-------------------------------------------------
1        08/20/2018        1          2 doses
1        08/21/2018        1          3 doses
1        08/22/2018        1          1 doses

Честно говоря, у меня нет нет идеи, как это сделать .. моя попытка не смогла подсчитать, сколько admin_grp имеет одинаковое значение в одном и том же pat_id не говоря уже об использовании этого количества в качестве фильтра. Если кто-то может помочь / предложить идеи, как справиться с этим, это будет высоко ценится.

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Предполагая, что любой admin_grp будет иметь только последовательные дни, вам просто нужно будет посчитать те записи по (ветвь, admin_grp), которые имеют 3 или более записей.

Например:

select x.* 
  from (select t.*
               ,count(*) over(partition by patid,admin_grp) as cnt
          from table t
       )x
 where x.cnt>=3
0 голосов
/ 26 февраля 2020

Краткий ответ: объедините таблицу с самим собой в 'pat_id' и отфильтруйте соответствующим образом:

Select a.* from TABLE a 
join (Select * from TABLE where daily_admin=‘3 doses’) b
using (pat_id) 
Where a.daily_admin in (‘1 doses’, ‘2 doses’, ‘3 doses’)

Кстати: слишком плохо, столбец daily_admin не является целым числом ... лучшую модель данных можно было бы сделать оператор Where немного проще:)

...