根据薪水为每个部门排名
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
说明
在上面的查询中,所有 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
我有以下 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
说明
在上面的查询中,所有 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