淄博网站推广优化,海商网做网站价格,html5毕业设计作品,前端线下培训这个SQL花了很久。但是有挺多启发的。
如果我们做不出来#xff0c;就去看答案。
但是看完答案之后#xff0c;不要着急就去看下一道题#xff0c;先把这道题吃透#xff0c;后面的题目就会更有思路。
题目#xff1a;
Table: Activity
-----------------------
| Co…这个SQL花了很久。但是有挺多启发的。
如果我们做不出来就去看答案。
但是看完答案之后不要着急就去看下一道题先把这道题吃透后面的题目就会更有思路。
题目
Table: Activity
-----------------------
| Column Name | Type |
-----------------------
| player_id | int |
| device_id | int |
| event_date | date |
| games_played | int |
-----------------------
player_idevent_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