SQL按键重复开始和结束日期

时间:2018-06-18 21:04:43

标签: sql sql-server-2016

(SQL Server 2016)给定下面描述的密钥和日期范围:

Key    Date
a      1/1/2018
b      1/1/2018
a      1/2/2018
b      1/2/2018
a      1/3/2018
b      1/3/2018
a      1/4/2018
b      1/4/2018
a      1/5/2018
b      1/5/2018
a      1/13/2018
b      1/13/2018
a      1/14/2018
b      1/14/2018
a      1/15/2018
b      1/15/2018
a      1/16/2018
a      1/17/2018
etc.

是否可以返回以下内容(每个键的组总是相隔一天):

Key    StartDate     EndDate
a      01/01/2018    01/05/2018   (first grouping for a)
a      01/13/2018    01/17/2018   (second grouping for a)
b      01/01/2018    01/05/2018
b      01/13/2018    01/15/2018
a      *new start*   *new end*
etc.

编辑:感谢您的评论。在回答下面的问题时,我尝试过Lead(),一个游标和多个嵌入循环。在大多数情况下,结果集不正确(错位日期或跳过键)或执行时间过长。

1 个答案:

答案 0 :(得分:1)

这是一种间隙和岛屿问题,但它与标准问题略有不同,因为两个键的日期序列彼此独立。您可以使用日期中的一个row_number()差异执行此操作:

select key, min(date), max(date)
from (select t.*,
             row_number() over (partition by key order by date) as seqnum_k
      from t
     ) t
group by key, dateadd(day,  - seqnum_k, date)
order by key, min(date);

这是使用ANSI标准语法进行日期算术;所有数据库都支持该功能,但语法可能会有所不同。