Sql server 稠密秩
鉴于以下情况Sql server 稠密秩,sql-server,tsql,null,dense-rank,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,
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
我希望11null
和21null
的实例是不同的等级。我希望将空值视为未知值,而不是将空值分组在一起
可以接受的答案是
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
我不在乎空值是在开头还是结尾,也就是说。我并不是在给事物排序。我使用densite\u RANK
作为一种方法,为每个组指定一个唯一的编号
我正在使用SQL server 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
我看到1空=等级3;而2 1空=秩7。这些不是不同的吗?不,稠密的列将空值视为相同的-因此存在问题,但是,如果我们有与现有列相同的新行数值,那么会发生什么,这里是列c