2010-09-08 5 views
0

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

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

+0

Почему вы не хотите использовать 'dense_rank'? Это самый эффективный способ сделать это. –

ответ

2

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

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

Примечания: В столбце сортировки должен быть уникальным, если вы не хотите для подсчета дубликатов. Например, если вы хотите ранжировать результаты тестов, то эта техника даст каждому с одинаковой оценкой одинаковый ранг, а не случайным образом назначая им все разные ранги).

в примере Yr,

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

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

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

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