2010-09-08 49 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'?這是做這件事最有效的方法。 – 2010-09-08 12:12:34

回答

2

是,簡單地計算行與(排序列)值小於當前行排序列值數...

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

不使用dense_rank你基本上有一個版本的運行總計的問題。

這是在SQL中以高效方式難以做到的事情。你可以像查爾斯的回答一樣使用三角形連接。如果你有超過幾百條記錄,你會發現這是由遊標執行,但是。

你爲什麼不想用dense_rank