题目
有如下一张 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中的开窗函数