我想根据开始日期每30天保留一次最长日期。为了简单起见,我在一个ID上测试了它,但实际数据包含很多ID。从开始日期开始每30天保留一次最长日期
我的数据看起来是这样的:
ID date
A 15JAN2016
A 11MAR2016
A 13MAY2016
A 25MAY2016
A 26MAY2016
A 08JUN2016
A 09JUN2016
A 10JUN2016
茶几应该是这样的:
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
你需要多少天?只有90或更多?或者全部? –
从2016年1月15日开始,全年为30天,尽管如果前几个日期正确(不确定是否有更好的方法可以做到这一点,比许多左外连接)我可以扩展代码。 – PinkyL
我不确定,但我认为你可以用窗口框架来做,阅读[这里](https://my.vertica.com/docs/7.1.x/HTML/index.htm#Authoring/AnalyzingData/WindowsWithALogicalOffsetRANGE .htm%3FTocPath%3DAnalyzing%2520Data%7CUsing%2520SQL%2520Analytics%7CThe%2520Window%2520OVER()%2520Clause%7CWindow%2520Framing%7C _____ 2)(最后一个例子)。 – sKwa