当我使用DENSE_RANK()
函数时,我在partition by子句和order by子句中使用了相同的列。所有行的Dense_rank结果是1.为什么会这样?
表:
orderid custid
10643 1
10692 1
10702 1
10308 2
10625 2
10759 2
10926 2
10365 3
10507 3
10535 3
10573 3
查询:
SELECT orderid, custid ,
DENSE_RANK() OVER (Partition BY custid ORDER BY custid) as desnse_rank
FROM TABLE
结果
orderid custid desnse_rank
10643 1 1
10692 1 1
10702 1 1
10308 2 1
10625 2 1
10759 2 1
10926 2 1
10365 3 1
10507 3 1
10535 3 1
10573 3 1
预期结果(据我对dense_rank()
的理解):
orderid custid desnse_rank
10643 1 1
10692 1 1
10702 1 1
10308 2 2
10625 2 2
10759 2 2
10926 2 2
10365 3 3
10507 3 3
10535 3 3
10573 3 3
答案 0 :(得分:3)
按列分区并按同一列排序没有意义,因为每个分区总是具有相同的列值可供订购。
您需要避免分区。 PARTITION BY
处的列将告诉排名何时重置为1并再次开始排名,即引用列更改值时。对于您的尝试,当custid
将值从1更改为2时,另一个分区将启动,密集排名将从1开始,这就是为什么您为所有行获得1的原因。
这将给出你想要的结果(只有1个分区!)。
SELECT orderid, custid , DENSE_RANK() OVER (ORDER BY custid) as dense_rank FROM TABLE
答案 1 :(得分:3)
只需使用order by
select orderid,custid
,DENSE_RANK() over (order by custid) rn
from @tabel