SQL.534.游戏玩法分析III

Table: Activity

±-------------±--------+
| Column Name | Type |
±-------------±--------+
| player_id | int |
| device_id | int |
| event_date | date |
| games_played | int |
±-------------±--------+
(player_id,event_date)是此表的主键。
这张表显示了某些游戏的玩家的活动情况。
每一行是一个玩家的记录,他在某一天使用某个设备注销之前登录并玩了很多游戏(可能是 0 )。

问题:
编写一个 SQL 查询,同时报告每组玩家和日期,以及玩家到目前为止玩了多少游戏。也就是说,在此日期之前玩家所玩的游戏总数。详细情况请查看示例。

法1:使用两表连结:

select t1.player_id,
       t1.event_date,
       sum(t2.games_played) games_played_so_far
from Activity t1,Activity t2
where t1.player_id=t2.player_id
  and t1.event_date>=t2.event_date
group by t1.player_id,t1.event_date;#注意这里必须先后按照两个字段分组,否则会把每个player_id的合在一条记录里。

法2:使用over函数:

SELECT PLAYER_ID, EVENT_DATE, SUM(GAMES_PLAYED) OVER(PARTITION BY PLAYER_ID ORDER BY EVENT_DATE) AS GAMES_PLAYED_SO_FAR
FROM ACTIVITY;

这里的SUM语法是:sum(字段1) over(partition by 字段2 order by 字段3 rows between unbounded preceding and current row) as 新字段名
函数说明:
sum(tota_amount)的求和是针对后面over()窗口的求和,
over中partition by name order by mon 针对name这一组按照月份排序,rows between unbounded preceding and current row 限定了行是按照在当前行不限定的往前处理,通俗就是处理当前以及之前的所有行的sum,即3月时sum(amount)求的时1、2、3月的和,2月时sum(amount)求的是1、2月的和。

猜你喜欢

转载自blog.csdn.net/shinytrainee/article/details/114109830