2010-09-08 50 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