我有一些数据如下:
[Row Number]
NULL
NULL
NULL
1
2
1
1
2
3
4
NULL
NULL
1
假设数据已经按照我想要的方式排序,是否可以按如下方式分配新的行号?
[Row Number] [New Row Number]
NULL 1
NULL 2
NULL 3
1 4
2 4
1 5
1 6
2 6
3 6
4 6
NULL 7
NULL 8
1 9
我想要的逻辑如下:
仅当
[New Row Number]
列为 [Row Number]
或 NULL
时,1
列才会递增。对于那些 [Row Number]
大于 1
的人,可以将它们视为该数字之前的最后一个 1
的重复项。
SQL Server 2016 有办法做到这一点吗?
在评论之后,我还添加了我在下面订购数据的列:
[PN] [CN] [Row Number] [New Row Number]
NULL 1 NULL 1
NULL 2 NULL 2
NULL 3 NULL 3
NULL 11 NULL 4
NULL 12 NULL 5
1 4 1 6
1 5 2 6
2 6 1 7
3 7 1 8
3 8 2 8
3 9 3 8
3 10 4 8
4 13 1 9
我已在
[PN]
然后 [CN]
然后 [Row Number]
上订购了我的数据。
只是以另一种方式重新表述我的问题,我想要一个行编号系统,它将
NULL
列中的每个 PN
值视为不同的值,因此行号应该递增。但是,当 [PN]
相同时,它不应增加。 [CN]
是每行的唯一标识符,即没有两行具有相同的 [CN]
。此外,如果 [PN]
是 NULL
,那么 [Row Number]
就是 NULL
。
我之前认为 NULL 的定位并不重要,所以我对此表示歉意!
这可以通过简单的窗口聚合摘要来解决:
DECLARE @data TABLE (data int, expected int, inheritsort int)
INSERT INTO @data
SELECT col1 AS data
, col2 AS expected
, ROW_NUMBER() OVER(ORDER BY @@trancount) AS inheritSort
FROM
(
VALUES (NULL, 1)
, (NULL, 2)
, (NULL, 3)
, (1, 4)
, (2, 4)
, (1, 5)
, (1, 6)
, (2, 6)
, (3, 6)
, (4, 6)
, (NULL, 7)
, (NULL, 8)
, (1, 9)
) t (col1,col2)
SELECT *
, SUM(CASE WHEN ISNULL(data, 1) = 1 THEN 1 ELSE 0 END) OVER(ORDER BY inheritsort) as rowIdActual
FROM @data
输出:
数据 | 预计 | 继承类别 | 实际行 ID |
---|---|---|---|
空 | 1 | 1 | 1 |
空 | 2 | 2 | 2 |
空 | 3 | 3 | 3 |
1 | 4 | 4 | 4 |
2 | 4 | 5 | 4 |
1 | 5 | 6 | 5 |
1 | 6 | 7 | 6 |
2 | 6 | 8 | 6 |
3 | 6 | 9 | 6 |
4 | 6 | 10 | 6 |
空 | 7 | 11 | 7 |
空 | 8 | 12 | 8 |
1 | 9 | 13 | 9 |