多个条件的 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()的主要内容,如果未能解决你的问题,请参考以下文章

SQL 怎么用指定条件查询RANK函数生成的新排名列?

oracle sql rank函数取排序值

N元线性方程组AX=B无解的充要条件是?

SQL多个条件模糊查询问题。。。

根据其他列中的条件更改 RANK() 的结果

SQL多个条件查询语句