我被要求写一个查询,该查询应根据客户的订单数量对客户进行排名。主要的重要因素是,如果订购了两个客户相同的数量,他们应该具有相同的等级。我想知道处理此查询的方法。为此我开始如下:
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.为什么这个函数以这种方式工作。我怎么能解决它。如果有可能任何人可以建议一个更好的查询,哪个有更好的表现,我会非常高兴。
答案 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