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

标签 sql sql-server row-number

我需要按顺序获取每条 null 记录的行号。获取行中的值时重新开始编号。

我已经试过了

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 查询获得所需的结果?

最佳答案

此方法使用 COUNT 作为 value 列的分析函数,为每个 NULL 值 block 生成“组”。要查看其工作原理,只需使用以下代码运行 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

关于sql - 如何获取每个空值的行号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55963939/

相关文章:

sql - 计算 SQL Server 中一个值的最大连续出现次数

sql - Teradata GROUPBY 的 Row_Number

sql - 您如何解释查询的解释计划?

mysql - 如何在 MySQL 中使用 tag_ids 获取相关问题?

MySQL查询从表中提取两条信息

SQL Server 按最接近零的值排序

tsql - 我需要一种我无法在 T-SQL 上用 ROW_NUMBER 弄清楚的组排序类型

python - 设计 SQL 数据库时,一对一关系是否意味着不必要的表?

sql-server - SQL Server 中奇怪的比较结果

c# - 多次调用相同的方法并显示进度