【问题标题】:Rank for each department based upon Salary根据薪水为每个部门排名
【发布时间】:2018-06-08 15:54:37
【问题描述】:

我有以下表格格式,包含 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;

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

提前致谢。

【问题讨论】:

    标签: mysql rank dense-rank


    【解决方案1】:

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

    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

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

    1     e2    120
    

    子查询将计算 a.120

    希望这是有道理的

    【讨论】:

    • 能否解释一下查询,Select *,(select 是什么意思??
    • @SrinivasanRajasekaran 我已经更新了我的答案,请看一下
    • @SrinivasanRajasekaran 我建议您先阅读文档,这有助于您对 correlated sub queriessub queries 有清晰的了解
    【解决方案2】:

    要使用用户定义的变量来实现相同的效果,您需要使用嵌套的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

    【讨论】:

    • 如果您不介意,也可以对此进行解释。THEN curRank ELSE curRank + 1 这两行的作用以及 FROM(SELECT * FROM emp, (SELECT dept:= NULL, Salary:= 0, curRank := 1) r ORDER BY Dept,salary DESC 这个语句是做什么的?
    猜你喜欢
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 2019-08-08
    相关资源
    最近更新 更多