Mysql 根据工资对每个部门进行排名

Mysql 根据工资对每个部门进行排名,mysql,rank,dense-rank,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 FR

我有下表格式,包含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
有两名员工共享相同的工资=150,所以回到父表最后一行的条件

1     e4    150
1     e2    120

子查询将使用用户定义的变量计算a.150以实现相同的目标,您需要使用嵌套的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

你能解释一下这个问题吗?选择*,选择意味着???@SrinivasanRajasekaran我已经更新了我的答案,请look@SrinivasanRajasekaran我建议你先看一下文档,如果你不介意的话,这将有助于你对这一点有清楚的理解和解释。然后是curRank ELSE curRank+1这两行的作用和选择*从emp中,选择dept:=NULL,salary:=0,curRank:=1 r ORDER BY dept,salary DESC此语句是否执行?
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