SQL Server 更新不带空值的行,按连续数字和空值排序



我有查询返回几行。其中有带有连续数字和空值的列。

例如,它的值从 1-10 然后是 5 个空值,然后是16-30 个,然后是 10 个空值,然后是 41-45 个空值,依此类推。

我需要更新该列或创建另一列以创建连续列的 groupId。

意思是,根据上面的示例,对于第 1-10 行,组 ID 可以是 1。然后对于 5 个空值,什么都没有,然后从 16-30 组 ID 可以是 2。然后对于 10 个空值,什么都没有。然后从 41-45 组 ID 可以是 3,依此类推。

请让我知道

这是一个有趣的问题。这是一个包含简单表的解决方案,该表仅包含整数,但有间隙。

create table n(v int)
insert n values (1),(2),(3),(5),(6),(7),(9),(10)
select n.*, g.group_no
from n
join (
select row_number() over (order by low.v) group_no, low.v as low, min(high.v) as high
from n as low
join n as high on high.v>low.v 
and not exists(select * from n h2 where h2.v=high.v+1)
where not exists(select * from n l2 where l2.v=low.v-1)
group by low.v
) g on g.low<=n.v and g.high>=n.v

结果:

v   group_no
1   1
2   1
3   1
5   2
6   2
7   2
9   3
10  3

典型的孤岛和间隙解决方案

select  col, grp = dense_rank() over (order by grp)
from    
(
select  col, grp = col - dense_rank() over (order by col)
from    yourtable
) d

最新更新