没有排名功能的排名

时间:2010-09-08 11:54:59

标签: sql ranking

我编写了以下查询,以便选择每个客户的排名,并在输出中显示其他信息。

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()功能的情况下完成排名工作。可能吗?

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分:0)

如果不使用dense_rank,您基本上会遇到运行总计问题的版本。

这在SQL中很难以高效的方式完成。您可以使用三角形连接,如Charles的答案。如果你有超过几百条记录,你会发现它不是由光标执行的。

为什么不想使用dense_rank

答案 2 :(得分:0)

---没有排名功能的排名销售员的脚本

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;