我编写了以下查询,以便选择每个客户的排名,并在输出中显示其他信息。
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 :(得分: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;