根据 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 中使用的相同列进行排序(无论如何在一个分区内它都是相同的值)