【问题标题】:SQL Ranking by consecutive date blocksSQL 按连续日期块排序
【发布时间】:2016-08-04 14:21:27
【问题描述】:

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

【问题讨论】:

  • 你的预期输出是什么?

标签: sql sql-server-2012 rank


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

【讨论】:

  • 我觉得这样可以,虽然最后我并没有完全这样做,但是我还是用了Rank,还有一个case语句,但是没有用这个case之后的inner order部分雄蕊,我缺少的一点是加入开始日期和结束日期,看看它们是否相同。谢谢
猜你喜欢
  • 1970-01-01
  • 2021-08-19
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
相关资源
最近更新 更多