根据薪水为每个部门排名

Rank for each department based upon Salary

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

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

我想return根据每个部门的薪水(最高到最低)对每个部门进行排名department.if薪水相同,排名也应该相同。

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

以上查询连续 returns rank.But 我需要每个部门的排名。

提前致谢。

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

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

说明

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

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

有 2 名员工共享相同的薪水 = 150 所以回到父级最后一行的条件 table

1     e4    150

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

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

1     e2    120

子查询将计算 a.120 <= emp 和 dept 的薪水相同,因此 table 中有 3 行(120,150,150)通过计算不同的薪水它将 return 作为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