SQL Server 2012 中的孤岛编号

Numbering islands in SQL Server 2012

我需要在 SQL Server 2012 中对岛屿进行编号。岛屿被定义为一组行,在同一 [=] 中 DateFromDateTo 之间没有天数间隔15=]).

以下数据集:

CREATE TABLE #Ranges (ItemId INT, DateFrom DATETIME, DateTo DATETIME)

INSERT INTO #Ranges VALUES (1,'2015-01-31','2015-02-17')
INSERT INTO #Ranges VALUES (1,'2015-02-18','2015-03-31')
INSERT INTO #Ranges VALUES (1,'2015-04-14','2015-05-21')
INSERT INTO #Ranges VALUES (2,'2015-07-12','2015-07-19')
INSERT INTO #Ranges VALUES (2,'2015-07-20','2015-07-24')
INSERT INTO #Ranges VALUES (2,'2015-07-26','2015-08-02')
INSERT INTO #Ranges VALUES (2,'2015-08-03','2015-08-07')

应编号如下:

ItemId;  DateFrom;    DateTo;      Number
1;       2015-01-31;  2015-02-17;  1
1;       2015-02-18;  2015-03-31;  1
1;       2015-04-14;  2015-05-21;  2
2;       2015-07-12;  2015-07-19;  3
2;       2015-07-20;  2015-07-24;  3
2;       2015-07-26;  2015-08-02;  4
2;       2015-08-03;  2015-08-07;  4

非常感谢任何帮助。

此致, 普热梅克

如果你只想对它们进行编号,那么我建议 lag() 使用累计总和:

select t.*,
       sum(case when datefrom = dateadd(day, 1, prev_dateto
                then 0 else 1
           end) over (order by itemId, datefrom)
from (select t.*,
             lag(dateto) over (partition by itemid order by datefrom) as prev_dateto
      from table t
     ) t;

case 决定新岛的起点。累计和就是把这个flag加起来。

您可以使用 LAGDENSE_RANK:

SqlFiddleDemo

WITH cte AS
(   SELECT 
       *
       ,LAG(DateFrom) OVER (ORDER BY DateFrom) AS PrevDateFrom 
       ,LAG(DateTo) OVER (ORDER BY DateFrom) AS PrevDateTo    
    FROM Ranges
)
SELECT ItemId, DateFrom, DateTo,
   DENSE_RANK() OVER(ORDER BY CASE WHEN DateFrom = PrevDateTo + 1 THEN PrevDateFrom ELSE DateFrom END) AS Number
FROM cte