如何获取每个空值的行号?
How to get row number for each null value?
我需要按顺序获取每条空记录的行号。获取行中的值时重新启动数字。
到目前为止我已经试过了
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
值块生成 "groups"。要查看其工作原理,只需 运行 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;
我需要按顺序获取每条空记录的行号。获取行中的值时重新启动数字。
到目前为止我已经试过了
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
值块生成 "groups"。要查看其工作原理,只需 运行 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;