DENSE_RANK区别对待 NULL



给定以下内容

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

相关内容

  • 没有找到相关文章