如何在sql 2008(northwind)中对客户进行排名

时间:2010-09-11 12:03:01

标签: sql sql-server sql-server-2008

我被要求写一个查询,该查询应根据客户的订单数量对客户进行排名。主要的重要因素是,如果订购了两个客户相同的数量,他们应该具有相同的等级。我想知道处理此查询的方法。为此我开始如下:

select tble1.customerid, RANK() OVER (ORDER BY tble1.counts desc) AS [cust grade] from
(select Orders.CustomerID, COUNT(*) as counts  from Orders 
group by CustomerID order by counts desc)tble1

正如你所提到的,表格的输出应该是这样的:
custid1 - 一些 - 级
custid2 - 一些 - 级
代码的问题是它跳过了一些数字。它运作良好,我的意思是如果两个客户拥有相同数量的订单,它会给他们相同的等级。但是接缝就像一个连续数字的队列,如果我们有例如三个4s,那么它们之后的下一个等级是7.但是我需要将它排列为5.为什么这个函数以这种方式工作。我怎么能解决它。如果有可能任何人可以建议一个更好的查询,哪个有更好的表现,我会非常高兴。

1 个答案:

答案 0 :(得分:2)

您需要使用dense_rank()代替rank(),以避免跳过数字。

;With tble1 AS
(
select Orders.CustomerID, 
COUNT(*) as counts  
from Orders 
group by CustomerID 
)
select tble1.customerid, 
DENSE_RANK() OVER (ORDER BY tble1.counts desc) AS [cust grade] 
from tble1