没有排名功能的排名

问题描述 投票:1回答:3

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

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

sql ranking
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 

0
投票

没有使用dense_rank,您基本上有了运行总计问题的版本。

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

您为什么不想使用dense_rank


0
投票

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

选择salesperson_id,amt,(从中选择count(*)+1(选择总和(sales_amount)为Amt从销售组按salesperson_id顺序按sum(sales_amount)desc)其中A.amt

© www.soinside.com 2019 - 2024. All rights reserved.