如何进行自定义行编号?

问题描述 投票:0回答:1

我有一些数据如下:

[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 的定位并不重要,所以我对此表示歉意!

sql sql-server sql-server-2016 ranking row-number
1个回答
0
投票

这可以通过简单的窗口聚合摘要来解决:

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
© www.soinside.com 2019 - 2024. All rights reserved.