1

我编写了以下查询,以便选择每个客户的等级并将其与输出中的其他信息一起显示。

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()函数的情况下进行排名工作。可能吗?

4

3 回答 3

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 
于 2010-09-08T12:03:46.260 回答
0

不使用dense_rank你基本上有一个运行总计问题的版本。

这是在 SQL 中很难以有效的方式完成的事情。您可以像查尔斯的回答一样使用三角连接。如果您有超过几百条记录,您会发现这是由游标执行的。

你为什么不想使用dense_rank

于 2010-09-08T12:24:08.727 回答
0

---没有Rank功能的Ranking业务员脚本

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;
于 2019-11-19T06:30:14.963 回答