根据 3 个月的日期间隔重置 ROW_NUMBER 计数
Resetting ROW_NUMBER count based on 3 month gap in date
正在寻找一个解决方案,如果日期字段 (clm_line_srvc_strt_dt) 中的间隔超过3个月。
当前使用以下行数:
,ROW_NUMBER()
OVER(PARTITION BY c.src_sbscrbr_id
, c.src_mbr_sqnc_nbr
, cl.hlth_srvc_cd
, df.serv_prov_id
ORDER BY c.src_sbscrbr_id
, c.src_mbr_sqnc_nbr
, cl.hlth_srvc_cd
, df.serv_prov_id
, cl.clm_line_srvc_strt_dt) as rncnt
例如:
会员ID 011有3条记录,clm_line_srvc_strt_dt字段分别为28Dec2017、28Apr2018和28Jul2018。
目前这 3 行的行数是 1、2、3。
由于 2017 年 12 月 28 日和 2018 年 4 月 28 日之间的间隔大于 3 个月,因此 28Apr2018 行的行数应重置为 1。所以它应该是 1, 1, 2,第三行继续计算,因为 28Apr2018 和 28Jul2018 之间的差距不超过 3 个月。
您可以使用累加和 lag()
来完成此操作。思路是:
sum(case when cl.clm_line_srvc_strt_dt < prev_clm_line_srvc_strt_dt + interval '3 month'
then 0 else 1
end) over (partition by c.src_sbscrbr_id, c.src_mbr_sqnc_nbr, cl.hlth_srvc_cd, df.serv_prov_id
order by cl.clm_line_srvc_strt_dt
) as rncnt
from (select . . .,
lag(cl.clm_line_srvc_strt_dt) over (partition by c.src_sbscrbr_id, c.src_mbr_sqnc_nbr, cl.hlth_srvc_cd, df.serv_prov_id) as prev_clm_line_srvc_strt_dt
. . .
) . . .
您可以在数据步骤中遵循滞后变量方法。我使用了示例数据:
data sample;
input Mem_Id clm_line_srvc_strt_dt date9.;
format clm_line_srvc_strt_dt date9.;
datalines;
1011 28Dec2017
1011 28Apr2018
1011 28Jul2018
1011 28Aug2018
2012 15Apr2017
2012 15Jul2017
2012 15Oct2017
;
run;
proc sort data=sample; by Mem_Id clm_line_srvc_strt_dt; run;
data sample1;
set sample;
by Mem_id clm_line_srvc_strt_dt;
Retain RowCount 0;
diff=intck('MONTH',lag(clm_line_srvc_strt_dt),clm_line_srvc_strt_dt);
if first.Mem_id then RowCount=1;
else if diff<=3 then rowcount=rowcount+1;
drop diff;
run;
proc print data=sample1; run;
Teradata 支持 Windowed Aggregates 的专有扩展 RESET WHEN,它添加了一种动态分区:
Row_Number()
Over(PARTITION BY c.src_sbscrbr_id
, c.src_mbr_sqnc_nbr
, cl.hlth_srvc_cd
, df.serv_prov_id
ORDER BY cl.clm_line_srvc_strt_dt
-- restart the row number when the previous date is more than 3 months ago
RESET WHEN Min(clm_line_srvc_strt_dt)
Over (PARTITION BY c.src_sbscrbr_id
, c.src_mbr_sqnc_nbr
, cl.hlth_srvc_cd
, df.serv_prov_id
ORDER BY cl.clm_line_srvc_strt_dt
ROWS BETWEEN 1 Preceding AND 1 Preceding)
< Add_Months(cl.clm_line_srvc_strt_dt, -3)) AS rncnt
根据 Gordon 回答中的错误消息,您的 Teradata 版本尚不支持 LAG(必须为 16.10+)。 MIN 等于:
LAG(clm_line_srvc_strt_dt)
Over (PARTITION BY c.src_sbscrbr_id
, c.src_mbr_sqnc_nbr
, cl.hlth_srvc_cd
, df.serv_prov_id
ORDER BY cl.clm_line_srvc_strt_dt)
顺便说一句,不需要按您已经在 PARTITION 中使用的相同列进行排序(无论如何在一个分区内它都是相同的值)
正在寻找一个解决方案,如果日期字段 (clm_line_srvc_strt_dt) 中的间隔超过3个月。
当前使用以下行数:
,ROW_NUMBER()
OVER(PARTITION BY c.src_sbscrbr_id
, c.src_mbr_sqnc_nbr
, cl.hlth_srvc_cd
, df.serv_prov_id
ORDER BY c.src_sbscrbr_id
, c.src_mbr_sqnc_nbr
, cl.hlth_srvc_cd
, df.serv_prov_id
, cl.clm_line_srvc_strt_dt) as rncnt
例如: 会员ID 011有3条记录,clm_line_srvc_strt_dt字段分别为28Dec2017、28Apr2018和28Jul2018。
目前这 3 行的行数是 1、2、3。
由于 2017 年 12 月 28 日和 2018 年 4 月 28 日之间的间隔大于 3 个月,因此 28Apr2018 行的行数应重置为 1。所以它应该是 1, 1, 2,第三行继续计算,因为 28Apr2018 和 28Jul2018 之间的差距不超过 3 个月。
您可以使用累加和 lag()
来完成此操作。思路是:
sum(case when cl.clm_line_srvc_strt_dt < prev_clm_line_srvc_strt_dt + interval '3 month'
then 0 else 1
end) over (partition by c.src_sbscrbr_id, c.src_mbr_sqnc_nbr, cl.hlth_srvc_cd, df.serv_prov_id
order by cl.clm_line_srvc_strt_dt
) as rncnt
from (select . . .,
lag(cl.clm_line_srvc_strt_dt) over (partition by c.src_sbscrbr_id, c.src_mbr_sqnc_nbr, cl.hlth_srvc_cd, df.serv_prov_id) as prev_clm_line_srvc_strt_dt
. . .
) . . .
您可以在数据步骤中遵循滞后变量方法。我使用了示例数据:
data sample;
input Mem_Id clm_line_srvc_strt_dt date9.;
format clm_line_srvc_strt_dt date9.;
datalines;
1011 28Dec2017
1011 28Apr2018
1011 28Jul2018
1011 28Aug2018
2012 15Apr2017
2012 15Jul2017
2012 15Oct2017
;
run;
proc sort data=sample; by Mem_Id clm_line_srvc_strt_dt; run;
data sample1;
set sample;
by Mem_id clm_line_srvc_strt_dt;
Retain RowCount 0;
diff=intck('MONTH',lag(clm_line_srvc_strt_dt),clm_line_srvc_strt_dt);
if first.Mem_id then RowCount=1;
else if diff<=3 then rowcount=rowcount+1;
drop diff;
run;
proc print data=sample1; run;
Teradata 支持 Windowed Aggregates 的专有扩展 RESET WHEN,它添加了一种动态分区:
Row_Number()
Over(PARTITION BY c.src_sbscrbr_id
, c.src_mbr_sqnc_nbr
, cl.hlth_srvc_cd
, df.serv_prov_id
ORDER BY cl.clm_line_srvc_strt_dt
-- restart the row number when the previous date is more than 3 months ago
RESET WHEN Min(clm_line_srvc_strt_dt)
Over (PARTITION BY c.src_sbscrbr_id
, c.src_mbr_sqnc_nbr
, cl.hlth_srvc_cd
, df.serv_prov_id
ORDER BY cl.clm_line_srvc_strt_dt
ROWS BETWEEN 1 Preceding AND 1 Preceding)
< Add_Months(cl.clm_line_srvc_strt_dt, -3)) AS rncnt
根据 Gordon 回答中的错误消息,您的 Teradata 版本尚不支持 LAG(必须为 16.10+)。 MIN 等于:
LAG(clm_line_srvc_strt_dt)
Over (PARTITION BY c.src_sbscrbr_id
, c.src_mbr_sqnc_nbr
, cl.hlth_srvc_cd
, df.serv_prov_id
ORDER BY cl.clm_line_srvc_strt_dt)
顺便说一句,不需要按您已经在 PARTITION 中使用的相同列进行排序(无论如何在一个分区内它都是相同的值)