Ранжирование без функций ранжирования

Я написал следующий запрос, чтобы выбрать ранг каждого клиента и показать его с другой информацией в выводе.

use northwind
go

select 
Employees.EmployeeID as ID, 
FirstName+' '+LastName as Name,
DENSE_RANK() over (order by SUM(Orders.OrderID)) as [Rank]
from 
employees 
inner join 
orders 
on
Employees.EmployeeID = Orders.EmployeeID
group by 
Employees.EmployeeID, 
FirstName+' '+LastName

Но я хочу знать, как выполнить ранжирование без использования функции DENSE_RANK(). Является ли это возможным?


person anna    schedule 08.09.2010    source источник
comment
Почему вы не хотите использовать dense_rank? Это самый эффективный способ сделать это.   -  person Martin Smith    schedule 08.09.2010


Ответы (3)


Да, просто подсчитайте количество строк со значением (столбец сортировки) меньше текущего значения столбца сортировки строк...

   Select *, 
         (Select Count(*) From Table 
          Where SortColumn <= t.SortColumn) as Rank
   From table t

ПРИМЕЧАНИЕ. Столбец сортировки должен быть уникальным, если вы не хотите подсчитывать дубликаты. Например, если вы хотите ранжировать результаты тестов, то этот метод даст каждому с одинаковым баллом один и тот же рейтинг вместо случайного присвоения им всех разных рангов).

в вашем примере,

Select e.EmployeeID as ID,   
   FirstName+' '+LastName as Name,  
   (Select Count(*) From Employees
    Where EmployeeID <= e.EmployeeId)  
From employees e  
   Join Orders o  
      On e.EmployeeID = o.EmployeeID  
Group by e.EmployeeID, FirstName+' '+LastName 
person Charles Bretana    schedule 08.09.2010

Без использования dense_rank у вас в основном есть версия проблемы промежуточных сумм.

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

Почему вы не хотите использовать dense_rank?

person Martin Smith    schedule 08.09.2010

--- Скрипт для продавца Ranking без функции Rank

select salesperson_id ,amt , 
  (select count(*) + 1 from 
       (select sum(sales_amount)as Amt 
              from sales group by salesperson_id order by sum(sales_amount) desc )B
        where A.amt < b.amt ) as Rank
 from 
 (select salesperson_id,sum(sales_amount)as Amt from sales group by salesperson_id order by sum(sales_amount) desc ) A
 order by amt desc;
person Newsinfield    schedule 19.11.2019