我有以下表格式,包含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;
以上查询不断返回排名。但我需要每个部门的排名。
提前致谢。
答案 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
在上面的查询中,将使用相关子查询获取所有表数据以及每行的排名。在不同工资记录的子查询计数中将从同一个表返回,但是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