作者:龙争虎斗石榴agj | 来源:互联网 | 2023-09-17 18:31
问题:
查询员工的累计薪水,Employee 表保存了一年内的薪水信息。请你编写 SQL 语句,对于每个员工,查询他除最近一个月(即最大月)之外,剩下每个月的近三个月的累计薪水(不足三个月也要计算)。结果请按 Id 升序,然后按 Month 降序显示。
Employee表:
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 |
Create table If Not Exists Employee (Id int, Month int, Salary int)
Truncate table Employee
insert into Employee (Id, Month, Salary) values ('1', '1', '20')
insert into Employee (Id, Month, Salary) values ('2', '1', '20')
insert into Employee (Id, Month, Salary) values ('1', '2', '30')
insert into Employee (Id, Month, Salary) values ('2', '2', '30')
insert into Employee (Id, Month, Salary) values ('3', '2', '40')
insert into Employee (Id, Month, Salary) values ('1', '3', '40')
insert into Employee (Id, Month, Salary) values ('3', '3', '60')
insert into Employee (Id, Month, Salary) values ('1', '4', '60')
insert into Employee (Id, Month, Salary) values ('3', '4', '70')
select
b.Id as id,
b.Month as month,
sum(a.Salary) as Salary
from
(select
*
from Employee e where
(e.Id,e.Month,e.Salary) not in
(select
Id,
max(Month) as Month,
max(Salary) as Salary
from
Employee group by id)) a join
(select
*
from Employee e where
(e.Id,e.Month,e.Salary) not in
(select
Id,
max(Month) as Month,
max(Salary) as Salary
from
Employee group by id)) b
on a.Id = b.Id and a.Month<=b.Month
group by b.Id,b.Month order by b.Id,b.Month desc
SELECT
Id,
Month,
Salary
FROM
(SELECT
Id,
Month,
SUM(Salary) OVER (PARTITION BY Id ORDER BY Month ROWS 2 PRECEDING) AS Salary,
rank() OVER (PARTITION BY Id ORDER BY Month DESC) AS r
FROM Employee) t
WHERE r > 1 ORDER BY Id, Month DESC