在分区中使用相同的列,并使用DENSE_RANK()进行排序

时间:2018-05-16 07:31:32

标签: sql sql-server

当我使用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

2 个答案:

答案 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