标记连续几天

时间:2014-06-01 03:18:10

标签: sql gaps-and-islands greenplum

据说我有类似这样的数据:

ID,DATE

101,01jan2014

101,02jan2014

101,03jan2014

101,07jan2014

101,08jan2014

101,10jan2014

101,12jan2014

101,13jan2014

102,08jan2014

102,09jan2014

102,10jan2014

102,15jan2014

我怎样才能在Greenplum SQL中对此进行有效编码,以便我可以连续几天进行类似下面的分组:

ID,DATE,PERIOD

101,01jan2014,1

101,02jan2014,1

101,03jan2014,1

101,07jan2014,2

101,08jan2014,2

101,10jan2014,3

101,12jan2014,4

101,13jan2014,4

102,08jan2014,1

102,09jan2014,1

102,10jan2014,1

102,15jan2014,2

1 个答案:

答案 0 :(得分:1)

您可以使用row_number()执行此操作。对于连续组,日期与row_number()之间的差异是常数。然后,使用dense_rank()分配句点:

select id, date,
       dense_rank() over (partition by id order by grp) as period
from (select t.*,
             date - row_number() over (partition by id order by date) * 'interval 1 day'
      from table t
     ) t