希望获得以下缺口和孤岛问题的帮助
我有以下示例数据集:
MEM_ID | CLM_ID | ADM_DTDCHG_DTPROV | ||
---|---|---|---|---|
1 | 111 | 01-01-2021 | 01-01-2021||
1 | 112 | 01-01-2021 | 02-01-20211 | |
1 | 113 | 2021年1月1日 | 01-01-20211 | |
1 | 114 | 2021年1月1日 | 01-01-2021<1>||
1 | 115 | 2021年1月1日 | >01-01-2021 | <1>|
1 | 116 | 2021年2月15日 | 2021||
1 | 117 | 2021年2月15日 | 02-15-20213 | |
1 | 118 | 2021年2月16日 | 22021年2月16-2021 | 3 |
21 | 01-01-2021 | 01-01-2021 | <1>||
22 | 12 | 2021年3月1日 | 22 | |
31 | 2021年2月1日 | 2021年2月2日1 | ||
32 | 2021年2月2日 | 22021年2月1日 |
select *,
sum(gap) over (partition by MEM_ID order by ADM_DT, CLM_ID) as grp
from (
select *,
case when
ADM_DT =
lag(ADM_DT) over (partition by MEM_ID, PROV order by ADM_DT, CLM_ID)
or
days_between(
ADM_DT,
lag(DCHG_DT) over (partition by MEM_ID, PROV order by ADM_DT, CLM_ID)
) in (0, 1) -- not sure if zero is valid
then 0 else 1 end as gap
from c1
) t
order by MEM_ID, PROV, GRP, ADM_DT
如果你没有days_between()
可用,那么显然你只会使用when lag(DCHG_DT) over (partition by MEM_ID, PROV order by ADM_DT, CLM_ID) - ADM_DT
注意,Postgres处理日期数学的方式不同,但你可以尝试一下https://dbfiddle.uk/?rdbms=postgres_13&fiddle=95f28f3d57c520d1e45422b588dcdd85