美文网首页
LeetCode-SQL-eight

LeetCode-SQL-eight

作者: 皮皮大 | 来源:发表于2020-03-17 11:57 被阅读0次

    Leetcode-sql-eight

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

    1. 玩家首次登陆分析

    2. 首次登陆的设备名称

    3. 此日期之前的玩家游戏总数

    4. 再次登录的分数

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

    题目

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

    image
    • 表的主键是play_id,event_data

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

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

    image

    答案

    答案

    select play_id,min(event_date) as first_login   -- 首次登陆的日期最小,使用min函数
    from activity
    group by play_id;
    

    总结

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

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

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

    题目

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

    image
    • 表的主键是play_id,event_data

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

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

    1. 首次登陆

    2. 设备名称

    答案

    1. 通过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;                                                
    
    1. 通过\color{red}{子查询}来解决
    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表,记录了一些游戏玩家在游戏平台上的行为活动。

    image
    • 表的主键是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;
    
    

    总结

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

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

    题目

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

    1. 首次登陆的第二天再登陆
    2. 玩家分数
    3. 小数位要求: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; 
    

    相关文章

      网友评论

          本文标题:LeetCode-SQL-eight

          本文链接:https://www.haomeiwen.com/subject/dhzzehtx.html