SQL 按连续日期块排名

SQL Ranking by consecutive date blocks

我正在尝试对连续日期块的数量进行排名,但最好的方法是什么?下面的示例显示前 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

您可以通过确定分组的开始位置、计算累加和来确定组,然后确定行号来完成此操作:

  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 适用于您提供的数据。它不会处理重叠超过一天的数据,也不会处理同一天开始的多个记录。这些都可以处理。如果您的数据更像那样,请提出另一个 问题,其中包含适当的数据。