查询员工的累计薪水(困难)

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

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

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

| Id | Month | Salary |
|----|-------|--------|
| 1  | 1     | 20     |
| 2  | 1     | 20     |
| 1  | 2     | 30     |
| 2  | 2     | 30     |
| 3  | 2     | 40     |
| 1  | 3     | 40     |
| 3  | 3     | 60     |
| 1  | 4     | 60     |
| 3  | 4     | 70     |

输出:

| Id | Month | Salary |
|----|-------|--------|
| 1  | 3     | 90     |
| 1  | 2     | 50     |
| 1  | 1     | 20     |
| 2  | 1     | 20     |
| 3  | 3     | 100    |
| 3  | 2     | 40     |

题解:

先利用row_number() over对原表增加一个辅助排序列,取排序列>1就能获取除最近一个月外的剩余月份。

其次,再使用一次sum() over函数求和,但是注意的是,原题需要每个月的近三月和,这是一个类似移动平均的问题,不是只求三个月。因此,我在over里加了一句rows 2 preceding,表示该行和下两行之和,也就是近3行之和。问题解决。

select e.id,e.month,sum(e.salary) over (partition by e.id order by e.month rows 2 preceding) Salary from
(select id,month,salary, row_number() over (partition by id order by month desc) rown from employee) e
where e.rown>1
order by id, month desc

你可能感兴趣的:(SQL)