首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Leetcode-sql-five

Leetcode-sql-five

作者头像
皮大大
发布2021-03-01 11:09:44
发布2021-03-01 11:09:44
9680
举报

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

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

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

题目

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

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

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

答案
代码语言:javascript
复制
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解决
代码语言:javascript
复制
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}{子查询}来解决
代码语言:javascript
复制
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语句,同时报告每组玩家和日期,以及玩家到此为止玩了多少场游戏,也就是此日期之前的游戏总数

答案
代码语言:javascript
复制
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函数
答案
代码语言:javascript
复制
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;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-3-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 511-游戏玩家分析(1)-首次登陆的日期
    • 题目
    • 答案
    • 总结
  • 512-游戏玩家分析(2)-首次登陆的设备名称
    • 题目
    • 答案
    • 总结
  • 534-游戏玩家分析(3)-玩家的游戏总数
    • 题目
    • 答案
    • 总结
  • 550-游戏玩家分析(4)-再次登录的分数
    • 题目
    • 答案
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档