Leetcode 进阶题

511.Game Play Analysis 1

在这里插入图片描述
This table shows the activity of players of some game.
这张表显示了一些游戏玩家的活动情况。
Each row is a record of a player who logged in and played a number of games(possibly 0) before logging out on some day using some device.
每一行都是一位玩家的记录,他在某一天使用某种设备登录并玩了许多游戏(可能是0)。

Write an SQL query that reports the first login date for each player.
编写一个SQL查询,报告每个播放器的第一个登录日期。
The query result format is in the following example:
查询结果格式如下所示:

在这里插入图片描述
在这里插入图片描述
题目要求是求每个玩家第一次登录的日期

所以输出结果是 player_id (玩家id) first_login(首次登录日期)

比如玩家1虽然有两次记录,但他的首次登录日期是2016年3月1日,所以结果里只需要记录2016年3月1号,逻辑清晰之后这个问题就变得非常简单

我们只需要按照玩家id去分类,求每个组内的日期最小值就可以了, 所以只要结合group by 和求最小值函数就可以直接得到

如果想弄的更有条理一点,可以加一个order by ,就会按照玩家id从小到大排序了

select player_id, min(event_date) first_login
from activity
group by player_id
order by player_id

进入下一题,Game Play Analysis 2

在这里插入图片描述

Write a SQL query that reports the device that is first logged in for each player.
编写一个SQL查询,报告每个玩家第一次登录的设备。
The query result format is in the following example:
查询结果格式如下所示:

比如玩家1两条记录的设备类型,都是类型2,那么结果表格中
,玩家1首次登录用的设备,显然就是设备类型2
而玩家3两次用到设备不同,我们只需要记录第一次使用的设备1

因为这里仍然涉及第一次登录的时间,我们可以重复利用上一题中的句子作为子表格b
并把它通过原表格通过 inner join 结合到一起

注意:join 时玩家id和登录日期都要对应

这样我们就只保留了表格b和表格a中共同存在的记录
也就是所有玩家第一次登录时的完整记录,这时候再把表格a中的设备类型记录,提取出来,这样就得到了所需要的结果

select player_id, device_id
from activity a 
join

(select player_id, min(event_date) first_login
from activity
group by player_id) b

on a.player_id = b.player_id and a.event_date = b.first_login

进入下一题,Game Play Analysis 3

在这里插入图片描述

Write an SQL query that reports for each player and date how many games played so far by the player.
编写一个SQL查询,报告每个玩家,日期到目前为止玩家玩了多久游戏。
That is, the total number of games played by the player until that date.Check the example for clarity.
也就是玩家在此日期之前所玩游戏的总数。检查这个例子是否清晰。
The query result format is in the following example:
查询结果格式如下所示:

要求计算每一个玩家对应的登录日期,当时过去总计完了多少个小时游戏
比如玩家1在3月1号一共玩了5个小时的游戏,而在5月2号那一天,一共完了11个小时,因为有第一次登录的5个小时,加上5月2号的6个小时,总计11个小时,以此类推

select 
	player_id,
	event_date,
	sum(games_played) over(partition by player_id order by event_date) as 
games_played_so_far
from activity

如果你已经掌握 window function 窗口函数,那这道题一句话就可以解决,非常简单
我在这里会继续去用 join 去达到相同的效果,这里采用的策略是让原表格自己和自己结合,只是合并条件改为玩家id相等,且其中一个表格的登录日期小于(或等于)另一个表格
由此得到的每一个 a 表格中的玩家 id 和登录日期会对应所有这个日期之前的 b 表格中同一位玩家的游戏记录,接下来就只要对玩家和登录信息进行分组,再把 b 表格中的游戏时间加起来就可以得到我们想要的结果

select a.player_id, a.event_date, sum(b.games_played) games_player_so_far
from activity a
left join activity b
on a.player_id = b.player_id and a.event_date >= b.event_date
group by a.player_id, a.event_date

在这里插入图片描述

Write an SQL query that reports the fraction of players that logged in again on the day after the day they first logged in, rounded to 2 decimal places. In other words, you need to count the number of players that logged in for at least two consecutive days starting from their first login date, then divide that number by the total number of players.
编写一个SQL查询,报告第一次登陆后第二天再次登陆的玩家比例,四舍五入到小数点后2位。换句话说,你需要计算,从第一次登录日期开始,连续登录至少两天的玩家数量,然后用这个数字除以总玩家数量。

这一题要求我们去求一个比例,计算出首次登录游戏,第二天紧接着又登录的玩家数量
除以总玩家数,且这个比例保留两微小数

从基本框架开始搭起,我们要求的是两个数相除,分母是总的玩家人数,所以只要用一个count,分子是符合一定条件的玩家数,这里用一个合并表格去找到这些玩家,只需要再合并条件里设置,保留那些登录日期等于玩家首次登录日期加一的那些行,然后再计算行号就可以了,这楼里的 distinct 其实可有可无,因为表格b里,每一个玩家其实就一行,不会存在重复情况,这样子就分布算出来了

select round(
	(
	 	select count(distinct a.player_id)
	 	from activity a
	 	join (select player_id, min(event_date) first_login
			  from activity
			  group by player_id) b
		on a.player_id = b.player_id and a.event_date = date_add(b.first_login, interval 1 day)
	)/(select count(distinct player_id) from actiivity)
	,2) as fraction

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44745905/article/details/112607358