力扣579(MySQL)-查询员工的累积薪水(困难)

发布时间 2023-03-28 11:20:50作者: 我不想一直当菜鸟

题目:

Employee 表保存了一年内的薪水信息。

请你编写 SQL 语句,对于每个员工,查询他除最近一个月(即最大月)之外,剩下每个月的近三个月的累计薪水(不足三个月也要计算)。

结果请按 Id 升序,然后按 Month 降序显示。

 输出:

 解题思路:

三个月内:假如当前月是4月,那么三个月的累积就是 4月工资 + 3月工资 + 2月工资。

  以上怎么算出来的?

id 为1 的员工工资分布月为1,2,3,4月,题目要求排除最大月,那就是1,2,3月,sum(第三行) = 第三行+第二行 +第一行 = 40+30+20 = 90,sum(第二行)=第二行+第一行 = 30+20 = 50,sum(第一行) = 20。

①先将表按id分组,再按Month进行降序排序,并增加一列序数值;

1  SELECT
2      Id, 
3      Month,
4      Salary,
5      DENSE_RANK() over ( PARTITION BY Id ORDER BY Month DESC ) 
6      AS rnk 
7 FROM employee_579

 ②筛选掉序数最高的,然后对工资进行求和,最终按id升序,当id一样的时候按Month降序排序。

 1 SELECT
 2     temp.Id,
 3     temp.Month,
 4     sum( temp.Salary ) over ( PARTITION BY temp.Id ORDER BY temp.Month ) AS salary 
 5 FROM
 6     ( SELECT Id, Month, Salary, DENSE_RANK() over ( PARTITION BY Id ORDER BY Month DESC ) AS rnk FROM employee_579 ) AS temp 
 7 WHERE
 8     temp.rnk > 1 
 9 ORDER BY
10     temp.Id,
11     temp.Month DESC;