我有以下表格格式,其中包含 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
说明
在上面的查询中,将使用相关子查询来获取所有表数据以及每行的排名,在子查询中,不同工资记录的计数将从同一个表返回,但部门相同(对于父查询和子查询)查询表)并且外表的工资小于或等于子查询中表的工资,因此考虑以下数据集
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/