Fork me on GitHub

Leetcode-sql-five

Leetcode-sql-five

本文中总结了LeetCode中关于SQL的游戏玩家分析的4个题目

  1. 玩家首次登陆分析
  2. 首次登陆的设备名称
  3. 此日期之前的玩家游戏总数
  4. 再次登录的分数

511-游戏玩家分析(1)-首次登陆的日期

题目

有个activity表,记录了一些游戏玩家在游戏平台上的行为活动。

  • 表的主键是play_id,event_data
  • 每行数据记录了一名玩家在退出平台之前,当天使用同一设备登陆后打开游戏的数目(可能是0个)

写一条SQL语句,获取每个玩家第一次登陆平台的日期,实现如下结果:

答案

1
2
3
select play_id,min(event_date) as first_login
from activity
group by play_id;

总结

本题难度是很简单的,只需要使用mingroup by 进行分组即可

  • min函数返回的最小值,不包含NULL
  • min和max函数也可用于文本列,
  • Group by函数根据一个或者多个列对结果进行分组

512-游戏玩家分析(2)-首次登陆的设备名称

题目

有个activity表,记录了一些游戏玩家在游戏平台上的行为活动。

  • 表的主键是play_id,event_data
  • 每行数据记录了一名玩家在退出平台之前,当天使用同一设备登陆后打开游戏的数目(可能是0个)

编写SQL语句,描述每一个玩家首次登陆的设备名称!

  1. 首次登陆
  2. 设备名称

答案

  1. 通过right jion解决
1
2
3
4
5
6
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;
  1. 通过$\color{red}{子查询}$来解决
1
2
3
4
5
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关键字可以包含两个字段信息

总结

  1. 怎么确定首次登陆:使用上面511题目的结果作为中间一个表格
  2. 可以用子查询或者两个表的连接
  3. rigth join on相当于将右边的结果作为左边的条件

534-游戏玩家分析(3)-玩家的游戏总数

题目

有个activity表,记录了一些游戏玩家在游戏平台上的行为活动。

  • 表的主键是play_id,event_data
  • 每行数据记录了一名玩家在退出平台之前,当天使用同一设备登陆后打开游戏的数目(可能是0个)

编写SQL语句,同时报告每组玩家和日期,以及玩家到此为止玩了多少场游戏,也就是此日期之前的游戏总数

答案

1
2
3
4
5
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;

总结

  1. 玩家名称和日期可以直接筛选
  2. 游戏总数需要另外使用sum函数和$\color{red}{中间表}$来解决

550-游戏玩家分析(4)-再次登录的分数

题目

题目同上,编写的SQL语句要求不同:首次登陆的第二天再次登录的玩家的分数,四色五入到小数点后两位

  1. 首次登陆的第二天再登陆
  2. 玩家分数
  3. 小数位要求:round函数

答案

1
2
3
4
5
6
7
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;

本文标题:Leetcode-sql-five

发布时间:2020年03月17日 - 11:03

原始链接:http://www.renpeter.cn/2020/03/17/Leetcode-sql-five.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea