DENSE_RANK明确地处理NULL

时间:2017-06-14 20:17:20

标签: sql-server tsql null dense-rank

鉴于以下内容

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视为未知值,而不是将空值组合在一起。

可接受的答案可能是

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 Server 2014

1 个答案:

答案 0 :(得分:2)

至少你可以通过添加一个在C为空时获取唯一值的虚拟列来这样做:

<td>@string.Format("{0:C}", t.Cost)</td>