Ранжирование без функций ранжирования - PullRequest
1 голос
/ 08 сентября 2010

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

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().Является ли это возможным?

Ответы [ 2 ]

3 голосов
/ 08 сентября 2010

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

   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 
0 голосов
/ 08 сентября 2010

Без использования dense_rank у вас в основном есть проблема с текущими итогами.

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

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

...