多个条件的 SQL Rank()
Posted
技术标签:
【中文标题】多个条件的 SQL Rank()【英文标题】:SQL Rank() for multiple conditions 【发布时间】:2015-09-04 10:11:57 【问题描述】:我有一组数据,用于存储员工及其在一段时间内(比如一个月)的收入。数据还存储多个站点,员工可以为每个站点获取收益。我正在尝试为数据添加一个排名,以便每个员工都有一个基于每个站点的收入的排名。
示例数据
EmpId Takings SiteID
1 150.00 1
1 0.00 2
2 0.00 1
2 100.00 2
3 100.00 1
3 1100.00 2
我已经尝试了以下查询,但这只给我最多两个排名:
SELECT EmpId,Takings,SiteID, RANK() OVER (PARTITION BY EmpId ORDER BY Takings DESC) AS [Rank]
FROM #test
这给了我以下结果集:
EmpId Takings SiteID Rank
1 150.00 1 1
1 0.00 2 2
2 100.00 2 1
2 0.00 1 2
3 1100.00 2 1
3 100.00 1 2
我期待以下结果集:
EmpId Takings SiteID Rank
1 150.00 1 1
1 0.00 2 3
2 100.00 2 2
2 0.00 1 3
3 1100.00 2 1
3 100.00 1 2
如果我修改分区以包含 SiteId,那么我的所有员工的排名都是 1。
我在这里遗漏了什么,我确信这应该是一个简单的查询,但此刻它正在杀死我。
谢谢
【问题讨论】:
在问题中,员工需要按每个站点的收入进行排名。有两个排名 1,因为有多个站点,每个站点都应该有一个排名 1 【参考方案1】:SELECT EmpId,Takings,SiteID, ROW_NUMBER() OVER (PARTITION BY SiteId ORDER BY Takings DESC) AS [Rank]
FROM #test
ORDER BY EmpId ASC, Takings DESC
希望是这个?
【讨论】:
我认为非常简单。我总是被 Rank() 绊倒 是的,起初我对你的帖子感到困惑,但后来你的最终结果让我意识到,“我想按 SiteId 安排事情并订购数量,然后是 EmployeeId?呃..不包含在分区中,但稍后会订购。”是的,我想这就是我得到这个的原因。以上是关于多个条件的 SQL Rank()的主要内容,如果未能解决你的问题,请参考以下文章