【SQL高频基础题】550.游戏玩法分析IⅣ

这个SQL花了很久。但是有挺多启发的。

如果我们做不出来,就去看答案。

但是看完答案之后,不要着急就去看下一道题,先把这道题吃透,后面的题目就会更有思路。

题目:

Table: Activity

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| player_id    | int     |
| device_id    | int     |
| event_date   | date    |
| games_played | int     |
+--------------+---------+
(player_id,event_date)是此表的主键(具有唯一值的列的组合)。
这张表显示了某些游戏的玩家的活动情况。
每一行是一个玩家的记录,他在某一天使用某个设备注销之前登录并玩了很多游戏(可能是 0)。

编写解决方案,报告在首次登录的第二天再次登录的玩家的 比率四舍五入到小数点后两位。换句话说,你需要计算从首次登录日期开始至少连续两天登录的玩家的数量,然后除以玩家总数。

思考:

其实一步一步来的。

需求是 首次登录日期开始至少连续两天登录的玩家的数量,然后除以玩家总数。

所以,我们只需要2个数据。

其中1个数据玩家总数比较好找。

另一个数据呢,需要稍花点心思。

我是看答案才写出来的。

人家的思路是很清晰的

1先找所有人第二天登录的时间
2然后连接原表 匹配人和时间对应的 找出所有第二天登录的人
3然后 再 把它作为数据来源,最后相除就行了。


我自己写是猜的,是完全用自己之前的知识去胡诌的

第1步和第2步,它是分开的。

而我总是把它混在一起,所以就很混乱,怎么也写不出来

下次我就知道了,如果要找多少天之后,就先查出来x天之后的,作为临时表,再去连本身表
 

在做这道题的时候,我还有其他10点收获:

1.子查询的select * ,可以在最外面作为 表资料传入 就像本sql 最后的 Result,Activity 一样,然后直接在select里count。而不用写在select 里 写select,好长的。
2.连接表的时候 除了left ,right join。还可以 直接用","然后后面用 where 
3.min 就需要group by  
4.有min函数 ,不能作为表连接on 的条件
5.group by 后面需要跟所有select查询 东东 
6.min 函数 是 min()。不是 (min)
7.count (distinct(xxx)) 而不是 count distinct xxx
8.如果sql执行错误,试着去执行每个片段sql,这样能够快速找到问题
9.ifnull 的判断
10.学新东西刚开始总是非常之费劲的。感觉自己是个傻逼。

参考答案:

select ifnull(round(count(distinct (Result.player_id))/count(distinct (Activity.player_id)),2),0)as fraction

from (select b.player_id from (select a.player_id,DATE_ADD(min(a.event_date),INTERVAL 1 day) as tomorrow

from Activity a group by a.player_id ) b ,Activity where b.player_id = Activity.player_id and b.tomorrow = Activity.event_date)as Result,Activity

你可能感兴趣的:(sql,游戏,数据库)