(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(),一个游标和多个嵌入循环。在大多数情况下,结果集不正确(错位日期或跳过键)或执行时间过长。
答案 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标准语法进行日期算术;所有数据库都支持该功能,但语法可能会有所不同。