我编写了以下查询,以便选择每个客户的排名,并在输出中显示它与其他信息。
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()函数的情况下进行排名工作。有可能吗?
发布于 2010-09-08 20:03:46
可以,只需计算(排序列)值小于当前行排序列值的行数...
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-08 20:24:09
如果不使用dense_rank,基本上就会有一个版本的运行总数问题。
这是很难在SQL中以有效方式完成的事情。您可以使用Charles的答案中的三角形连接。但是,如果您有几百条以上的记录,您会发现这是游标无法完成的。
你为什么不想使用dense_rank
发布于 2019-11-19 14:30:15
-不带Rank函数的排名销售员脚本
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;https://stackoverflow.com/questions/3667426
复制相似问题