从开始日期开始每 30 天保持最大日期

Keep maximum date every 30 days starting from a beginning date

我试图根据开始日期每 30 天保留一次最大日期。为了简单起见,我在一个ID上进行了测试,但实际数据包含多个ID。

我的数据看起来像这样:

ID     date
A      15JAN2016
A      11MAR2016
A      13MAY2016
A      25MAY2016
A      26MAY2016
A      08JUN2016
A      09JUN2016
A      10JUN2016

结尾 table 应该是这样的:

ID      Max_srv_dt_1    Max_srv_dt_2   Max_srv_dt_3  Max_srv_dt_4
A       15Jan2016       11Mar2016      13May2016     10JUN2016

我的代码:

 SELECT c1.ID, 
        MIN_SRV_DT_1, 
        Max_SRV_DT_2, 
        Max(C2.date) OVER (PARTITION BY c2.ID ORDER BY C2.date+30) Max_SRV_DT_3
 FROM
    (SELECT c1.ID, MIN_SRV_DT_1, max(C2.date) OVER (PARTITION BY c2.ID ORDER BY C2.date+30) Max_SRV_DT_2
       FROM 
          (SELECT c1.ID, MIN(C1.date) MIN_SRV_DT_1
           FROM max_ep_test C1
           GROUP BY c1.ID) C1
       LEFT OUTER JOIN max_ep_test C2  
         ON c1.ID = c2.ID
        AND C2.date < C1.MIN_SRV_DT_1 + 30
      ) C1
      LEFT OUTER JOIN max_ep_test C2
        ON c1.ID = c2.ID
       AND C2.date > max_srv_dt_2 + 30

我得到如下内容,但不知道如何更改参数以实际获取正确的日期:

ID   min_srv_dt_1   max_srv_dt_2   max_srv_dt_3
A    15JAN2016      15JAN2016      11MAR2016
A    15JAN2016      15JAN2016      13MAR2016
A    15JAN2016      15JAN2016      13MAY2016
A    15JAN2016      15JAN2016      25MAY2016
A    15JAN2016      15JAN2016      26MARY016
A    15JAN2016      15JAN2016      08JUN2016
A    15JAN2016      15JAN2016      09JUN2016
A    15JAN2016      15JAN2016      10JUN2016

您可以使用 datediff() 计算任意日期与最早日期之间的差值。剩下的只是聚合:

select id, max(date)
from (select et.*,
             datediff('day', min(date) over (partition by id), date) as datediff_day
      from max_ep_test et
     ) et
group by floor(datediff_day / 30);