LeetCode-SQL-eight
2020-03-17 本文已影响0人
皮皮大
Leetcode-sql-eight
本文中总结了LeetCode
中关于SQL
的游戏玩家分析的4个题目
-
玩家首次登陆分析
-
首次登陆的设备名称
-
此日期之前的玩家游戏总数
-
再次登录的分数
511-游戏玩家分析(1)-首次登陆的日期
题目
有个activity
表,记录了一些游戏玩家在游戏平台上的行为活动。
-
表的主键是play_id,event_data
-
每行数据记录了一名玩家在退出平台之前,当天使用同一设备登陆后打开游戏的数目(可能是0个)
写一条SQL语句,获取每个玩家第一次登陆平台的日期,实现如下结果:
image答案
答案
select play_id,min(event_date) as first_login -- 首次登陆的日期最小,使用min函数
from activity
group by play_id;
总结
本题难度是很简单的,只需要使用min
和group by
进行分组即可
-
min
函数返回的最小值,不包含NULL
- min和max函数也可用于文本列,
-
Group by
函数根据一个或者多个列对结果进行分组
512-游戏玩家分析(2)-首次登陆的设备名称
题目
有个activity
表,记录了一些游戏玩家在游戏平台上的行为活动。
-
表的主键是
play_id,event_data
-
每行数据记录了一名玩家在退出平台之前,当天使用同一设备登陆后打开游戏的数目(可能是
0
个)
编写SQL
语句,描述每一个玩家首次登陆的设备名称!
-
首次登陆
-
设备名称
答案
- 通过
right jion
解决
select a.player_id, a.device_id from activity a
right join (select play_er, min(event_date) as latest_date
from activity
group by play_id) b -- 将上面的结果作为表b
on a.event_date = b.latest_date
where a.player_id = b.play_id;
- 通过来解决
select a.play.id, a.device_id
from activity a
where (a.play_id, a.event_date) in (select play_id, min(event_date) as first_login
from activity
group by player_id); --将子查询的结果作为条件,in关键字可以包含两个字段信息
总结
-
怎么确定首次登陆:使用上面
511
题目的结果作为中间一个表格 -
可以用子查询或者两个表的连接
-
rigth join on
相当于将右边的结果作为左边的条件
534-游戏玩家分析(3)-玩家的游戏总数
题目
有个activity
表,记录了一些游戏玩家在游戏平台上的行为活动。
-
表的主键是
play_id,event_data
-
每行数据记录了一名玩家在退出平台之前,当天使用同一设备登陆后打开游戏的数目(可能是0个)
编写SQL
语句,同时报告每组玩家和日期,以及玩家到此为止玩了多少场游戏,也就是此日期之前的游戏总数。
答案
select a.player, a.event_date, (select sum(b.games_played) -- 求和函数sum()
from activity b
where a.play_id=b.play_id
and a.event_date=b.event_date) as b "games_played_as_far" -- 通过临时表筛选出此日期前的游戏总数
from activity as a;
总结
- 玩家名称和日期可以直接筛选
- 游戏总数需要另外使用
sum
函数和来解决
550-游戏玩家分析(4)-再次登录的分数
题目
题目同上,编写的SQL
语句要求不同:首次登陆的第二天再次登录的玩家的分数,四色五入到小数点后两位
- 首次登陆的第二天再登陆
- 玩家分数
- 小数位要求:
round
函数
答案
select round((select count(distinct b.play_id)
from activity as b, activity as c
where b.event_date=(select min(temp.event_date)
from activity as temp.play_id=b.play_id)
and b.play_id=play_id
and datediff(b.event_date, c.event_date=-1)/count(distinct a.play_id), 2) as "fraction"
from activity as a;