【问题标题】:Get difference in top 2 salary of employee from each department获取每个部门员工前2名的工资差异
【发布时间】:2017-10-19 06:56:38
【问题描述】:

我有一个简单的员工表,我需要在其中找到每个部门中最高级别的两个薪水之间的差异。 我有表列: dept,sal,rank

样本数据可以是

Dept        Sal     Rank
Finance     10000   1
Finance     20000   2
Finance     11000   1
Finance     15000   3
Finance     45000   4
Finance     42000   4
Operations  17000   1
Operations  12000   1
Operations  15000   2
Operations  19000   2

想要的输出是

Dept        Diff    Rank
Finance     3000    4
Operations  4000    2

我设法以非常低效的方式获取前 2 名记录。 我正在使用 mysql 服务器。

这里是查询

SELECT *
FROM   emps s
WHERE 
        (
            SELECT  COUNT(*) 
            FROM    emps  f
            WHERE f.dept = s.dept AND 
                  f.rank >= s.rank
        ) <= 2

我需要进一步的帮助才能获得输出。

【问题讨论】:

标签: mysql database mariadb greatest-n-per-group


【解决方案1】:

您可以尝试以下查询:

SELECT Dept, MAX(Rank) AS Rank,
       SUM(CASE 
              WHEN rnk = 1 THEN Sal 
              WHEN rnk = 2 THEN -Sal 
              ELSE 0
           END) AS diff
FROM (
   SELECT @rnk := IF(@dept = Dept, @rnk + 1,
                     IF(@dept := Dept, 1, 1)) AS rnk,
          Dept, Sal, Rank                  
   FROM emp
   CROSS JOIN (SELECT @rnk := 0, @dept = '') AS vars
   ORDER BY Dept, Rank DESC, Sal DESC) AS t
GROUP BY Dept   

查询使用变量根据RankSal 值为每条记录分配一个排名编号。外层查询消费变量值并进行条件聚合计算第一和第二排名记录的差值。

Demo here

【讨论】:

  • 谢谢。我不知道这个特定的查询是如何工作的。但我会尽快调试它的每一行以理解。如果需要,将再次打扰您。再次感谢。
  • 请你解释一下这里发生了什么......太棒了
猜你喜欢
  • 2021-01-31
  • 2023-03-22
  • 2021-03-15
  • 2012-08-02
  • 2022-12-02
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
相关资源
最近更新 更多