基于薪水的每个部门的排名

时间:2017-12-28 04:54:44

标签: mysql rank dense-rank

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

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;

以上查询不断返回排名。但我需要每个部门的排名。

提前致谢。

2 个答案:

答案 0 :(得分:2)

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

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是相同的(对于父查询和子查询)查询表)和外表的工资小于或等于子查询中的表的工资,因此考虑以下数据集

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

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

1     e4    150

子查询将计算a.150&lt; =来自emp和dept的工资是相同的,因此在表中有2行(150,150)通过计算不同的工资它将它返回为1,相同的情况适用于第二行。

让我们再考虑父表的行

1     e2    120

子查询将计算a.120&lt; =来自emp和dept的工资是相同的,因此表中有3行(120,150,150)通过计算不同的工资它会将其作为2返回

希望这是有道理的

答案 1 :(得分:0)

要使用用户定义的变量实现相同的目的,您需要使用嵌套的case语句来检查相同的部门和同一部门内的相同工资

SELECT p.Dept,
       p.name,
       p.salary,
       @curRank := CASE WHEN @dept = p.Dept 
       THEN 
            CASE WHEN @salary = p.salary  
            THEN @curRank 
            ELSE @curRank + 1 
            END
       ELSE @curRank:= 1 END AS Order_emp,
       @dept:= p.Dept,
       @salary := p.salary
FROM(SELECT *
     FROM emp,
     (SELECT @dept:= NULL, @salary:= 0, @curRank := 1) r
     ORDER BY Dept, salary DESC
) p

DEMO