给定以下内容
DECLARE @Table TABLE(
A INT,
B INT,
C INT
)
INSERT INTO @Table SELECT 1, 1, NULL
INSERT INTO @Table SELECT 1, 1, NULL
INSERT INTO @Table SELECT 1, 1, 1
INSERT INTO @Table SELECT 1, 1, 2
INSERT INTO @Table SELECT 1, 1, 2
INSERT INTO @Table SELECT 1, 1, 2
INSERT INTO @Table SELECT 1, 2, 1
INSERT INTO @Table SELECT 1, 2, 2
INSERT INTO @Table SELECT 2, 1, NULL
INSERT INTO @Table SELECT 2, 1, NULL
INSERT INTO @Table SELECT 2, 1, 1
INSERT INTO @Table SELECT 2, 2, 1
INSERT INTO @Table SELECT 2, 2, 1
INSERT INTO @Table SELECT 2, 2, NULL
SELECT A, B, C, DENSE_RANK() OVER (ORDER BY A,B,C DESC) AS rank
FROM @Table
结果是:
A B C rank
1 1 2 1
1 1 2 1
1 1 2 1
1 1 1 2
1 1 NULL 3
1 1 NULL 3
1 2 2 4
1 2 1 5
2 1 1 6
2 1 NULL 7
2 1 NULL 7
2 2 1 8
2 2 1 8
2 2 NULL 9
我希望1 1 NULL
和2 1 NULL
的实例是不同的等级。我希望将 NULL 视为未知值,而不是将 null 组合在一起。
一个可接受的答案可能是
A B C rank
1 1 2 1
1 1 2 1
1 1 2 1
1 1 1 2
1 1 NULL 3
1 1 NULL 4
1 2 2 5
1 2 1 6
2 1 1 7
2 1 NULL 8
2 1 NULL 9
2 2 1 10
2 2 1 10
2 2 NULL 11
我不在乎空值是在开头还是结尾,也就是说。我实际上并没有对事物进行排名。我使用DENSE_RANK
作为给每个组一个唯一编号的一种手段。
我正在使用 SQL 服务器 2014
至少你可以通过添加一个虚拟列来做到这一点,该虚拟列在 C 为 null 时获得唯一值:
SELECT A, B, C, DENSE_RANK() OVER (ORDER BY A,B,C DESC, dummy) AS rank
FROM (
select *, case when C is null then row_number() over (order by (select null)) end as dummy
from @Table
) X