如何根据连续数字中的差距将行号分配给一组行分区SQL

时间:2016-08-19 19:30:32

标签: sql sql-server-2012

Hello Development Community,

有没有办法根据SQL中连续数字字段中的间隙为一组行分配一个数字?我已经搜索/尝试了各种各样的事情,以便在几天内找到答案并且空洞。请考虑以下示例:

CREATE TABLE #example
(ID int, Service_Date date, Item_Num int, Desired_Column int)

INSERT INTO #example VALUES
('1111', GetDate(), 4, 1),
('1111', GetDate(), 5, 1),
('1111', GetDate(), 7, 2),
('1111', GetDate(), 8, 2),
('1111', GetDate(), 9, 2),
('1111', GetDate(), 11, 3),
('1111', GetDate(), 12, 3),
('1111', GetDate(), 13, 3)

我正在尝试在Desired_Column中分配值但是失败了。每当连续的Item_Num值存在间隙时,应分配新的数字。我尝试过使用DENSE_RANK(),PARTITION BY,NTILE()的多种方法,找到第一个/下一个行项目编号之间的差异,但我无法使其正常工作。这甚至可能吗?

感谢您抽出宝贵时间,感谢您。

1 个答案:

答案 0 :(得分:1)

这是间隙&孤岛问题,一个常见的解决方案是应用嵌套的分析函数。首先,你根据条件计算一个标志(这里:当前行和前一行之间有一个间隙> 1),然后你对该标志进行累积和:

with cte as
 (

    select ...,
       case when lag(Item_Num) over (partition by ID order by Item_Num) + 1 
              = Item_Num
            then 0 -- gap = 1 -> part of the previous group
            else 1 -- gap > 1 ->new group
       end as flag
    from #example
 )
select ...,
   sum(flag) over (partition by ID order by Item_Num) 
from cte