2017-08-29 90 views
0

我想根据开始日期每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 
+0

你需要多少天?只有90或更多?或者全部? –

+0

从2016年1月15日开始,全年为30天,尽管如果前几个日期正确(不确定是否有更好的方法可以做到这一点,比许多左外连接)我可以扩展代码。 – PinkyL

+0

我不确定,但我认为你可以用窗口框架来做,阅读[这里](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

回答

1

您可以使用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); 
+0

OP需要30天的最大日期。也需要该字段,因此可以在聚合后执行Pivot。 [**在Vertica **中旋转](https://forum.vertica.com/discussion/211469/are-there-sql-commands-to-pivot-data) –

+0

我得到一个错误:运算符不存在:int - 日期 – PinkyL

相关问题