mysql - 各部门按薪资排名

标签 mysql rank dense-rank

我有以下表格格式,其中包含 100 个值,其中包含 10 个不同的部门,

Dept  name  salary
1     e1    100
1     e2    120
1     e3    140
1     e4    150

我想按每个部门的薪水(最高到最低)返回每个部门的排名。如果薪水相同,则排名也应该相同。

SELECT    Dept,
          name,
          salary,
          @curRank := @curRank + 1 AS Order_emp
FROM      emp p, (SELECT @curRank := 0) r
ORDER BY Dept, salary DESC;

上面的查询连续返回排名。但我需要每个部门的排名。

提前致谢。

最佳答案

另一种不使用用户定义变量并使用相关子查询的方法

select a.*,
(select count(distinct salary)
from emp 
where Dept = a.Dept
and a.salary <= salary
) rank
from emp a
order by Dept,rank

DEMO

说明

在上面的查询中,将使用相关子查询来获取所有表数据以及每行的排名,在子查询中,不同工资记录的计数将从同一个表返回,但部门相同(对于父查询和子查询)查询表)并且外表的工资小于或等于子查询中表的工资,因此考虑以下数据集

Dept  name  salary
1     e1    100
1     e2    120
1     e3    150
1     e4    150

有 2 名员工的工资相同 = 150,所以回到父表最后一行的条件

1     e4    150

子查询将计算 a.150 <= emp 和 dept 的薪水相同,因此表中有 2 行 (150,150),通过计算不同的薪水,它会将其返回为 1,同样的情况适用于倒数第二行。

让我们再次考虑父表的以下行

1     e2    120

子查询将计算 a.120 <= emp 和 dept 的薪水相同,因此表 (120,150,150) 中有 3 行,通过计算不同的薪水,它会将其返回为 2

希望这是有道理的

关于mysql - 各部门按薪资排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48001739/

相关文章:

mysql - Grails:将枚举类型的mysql字段映射到域类

MYSQL查询太大

mysql - MariaDB *.myi 文件没有出现在文件管理器中

mysql - 获取当前排名加入另一个表,MySql

java - Java 引用书目程序

sql - DENSE_RANK() 无重复

mysql - TIMESTAMPDIFF 在 mysql 中返回 blob

seo - url 尾部斜杠和 seo

sql-server - 在 SQL Server 中使用 Dense_Rank 对具有排名的列进行排名组合

sql - 满足条件时重新启动 Row_Number 序列