DENSE_RANK 区别对待 NULL
DENSE_RANK treat NULL distinctly
鉴于以下情况
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
鉴于以下情况
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