Mysql 根据工资对每个部门进行排名
我有下表格式,包含100个值,包括10个不同的部门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
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