как ранжировать клиентов в sql 2008 (северный ветер) - PullRequest
2 голосов
/ 11 сентября 2010

меня попросили написать запрос, который должен ранжировать клиентов по количеству заказов, которые у них есть. Основным важным фактором является то, что если два клиента были заказаны в одинаковом количестве, они должны иметь одинаковый ранг. Я хочу знать, как обработать этот запрос. для этого я начал как показано ниже:

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 - некоторые - класс
проблема кода в том, что он пропускает некоторые числа. это работает хорошо, я имею в виду, если два клиента имеют одинаковое количество заказов, это дает им одинаковую оценку. но это выглядит как очередь последовательных чисел, что, если у нас есть, например, три четверки, следующая оценка после них - 7. Но мне нужно присвоить ей оценку 5. Почему эта функция работает таким образом. как я могу это исправить. если это возможно, кто-нибудь может предложить лучший запрос, который имеет лучшую производительность, я буду очень доволен.

1 Ответ

2 голосов
/ 11 сентября 2010

Вам нужно использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...