按连续日期块排序的SQL排名

时间:2016-08-04 14:21:28

标签: sql sql-server-2012 rank

我试图对连续日期块的数量进行排名,但最好的方法是什么?下面的示例显示前3个块是连续的,然后4个在它们之间有一个月,所以计数将再次开始。

数据我试图订购:

    StartDate |  EndDate  |Rank
    ----------+-----------+----
    01/01/2016| 01/02/2016| 1
    01/02/2016| 01/03/2016| 2
    01/03/2016| 01/04/2016| 3
    01/05/2016| 01/06/2016| 1

1 个答案:

答案 0 :(得分:1)

您可以通过识别分组的开始位置,执行累计和以识别组,然后是行号来执行此操作:

  select t.*,
         row_number() over (partition by grp order by startdate) as rank
  from (select t.*,
               sum(case when tprev.startdate is null then 1 else 0 end) over (order by startdate) as grp
        from t left join
             t tprev
             on t.startdate = tprev.enddate
       ) t;

此特定SQL适用于您提供的数据。它不会处理重叠超过一天的数据,也不会处理同一天开始的多个记录。这些都可以处理。如果您的数据更类似,请询问另一个问题,并在其中包含相应的数据。