Numbering islands in SQL Server 2012

耗尽温柔 提交于 2019-12-04 11:22:16

If you want to just number them, then I would suggest lag() with a cumulative sum:

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;

The case determines where a new island begins. The cumulative sum just sums this flag.

You can use LAG and DENSE_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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!