SQL每日一题10:累计求和问题

63 阅读2分钟

题目

有如下一张 T20191111 表:

其中games_played是玩家登陆玩的游戏数量, 查询每个玩家每天累计玩的游戏数量有多少?结果如下:

解释:玩家1第一次玩了5个,所以是5,第二次是6个,所以累计就是5+6=11, 第三次是1个,累计就是5+6+1=12 玩家2类似

参考答案

create table T20191111
(
play_id int,
device_id int,
event_date date,
games_played int
)

insert into T20191111 values 
(1,2,'2016-03-01',5);
insert into T20191111 values 
(1,2,'2016-05-02',6);
insert into T20191111 values 
(1,3,'2017-06-25',1);
insert into T20191111 values 
(3,1,'2016-03-02',0);
insert into T20191111 values 
(3,4,'2018-07-03',5);

--MySQL 8.0和SQL Server解法
--方法一:
select 
a1.play_id,a1.event_date,
sum(a2.games_played) games_played_so_far
from T20191111 a1,T20191111 a2
where a1.play_id=a2.play_id
and a1.event_date>=a2.event_date
group by a1.play_id,a1.event_date
order by a1.play_id,a1.event_date;

--方法二:
select 
play_id,
event_date,
sum(games_played) over
(partition by player_id 
order by event_date) games_played_so_far
from T20191111

答案解析

方法一是通过自连接查询,以及循环累加的方式来实现的,其中这里的循环累加需要条件 a1.event_date>=a2.event_date,

即只要排序后下一条记录的日期大于上一条记录的日期,那么就把他们的games_played进行求和(sum(a2.games_played)),通过这样的方式间接的来实现循环累加的目的。

方法二是通过sum()开窗函数来实现循环累加的,开窗函数的用法比较固定。 参考链接:SQL中的开窗函数