如何获取每个空值的行号?

时间:2019-05-03 05:50:36

标签: sql sql-server row-number

我需要按顺序获取每个空记录的行号。在该行中获取值时重新启动数字。

到目前为止我已经尝试过

select *
     , ROW_NUMBER() over (order by id) rn
from @tbl 

select *
     , ROW_NUMBER() over (partition by value order by id) rn
from @tbl 
declare @tbl table(id int, value int)
insert into @tbl values 
(1, null), (2, null), (3, null), (4, 1),(5, null), (6, null), (7, 1), (8, null), (9, null), (10, null)

select *
     , ROW_NUMBER() over (partition by value order by id) rn
from @tbl 

我得到这个:

id, value,  rn
1   NULL    1
2   NULL    2
3   NULL    3
4   1       4
5   NULL    5
6   NULL    6
7   1       7
8   NULL    8
9   NULL    9
10  NULL    10

我想要这样的结果

id, value,  rn
1   NULL    1
2   NULL    2
3   NULL    3
4   1       1
5   NULL    1
6   NULL    2
7   1       1
8   NULL    1
9   NULL    2
10  NULL    3

如何通过sql查询获得所需的结果?

1 个答案:

答案 0 :(得分:3)

此方法将COUNT用作value列的分析函数,以为NULL值的每个块生成“组”。要查看其工作原理,只需使用以下代码运行SELECT * FROM cte。然后,使用此计算组,我们使用ROW_NUMBER来生成NULL值的序列。我们按值升序排列,这意味着每个NULL行号序列始终以1开头,这就是我们想要的行为。对于具有非NULL值的记录,我们只需将该值拖入rn列即可。

WITH cte AS (
    SELECT *, COUNT(value) OVER (ORDER BY id) vals
    FROM @tbl
)

SELECT id, value,
    CASE WHEN value IS NULL
         THEN ROW_NUMBER() OVER (PARTITION BY vals ORDER BY value)
         ELSE value END AS rn
FROM cte
ORDER BY id;

enter image description here

Demo