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 NULL2 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