快乐SQL做题 - Day4

Hello!!今天是DAY 4啦~一起来看看今天有什么题目吧~

闯关开始啦

关卡1-  游戏玩法分析 I

思路:

这道题我们要选出每个人最开始的登录日期,那就要group by每个人

然后在select语句里选中minimum的日期,就可以啦

select player_id, min(event_date) as first_login from Activity

group by player_id

恭喜过关!进入下一关!


关卡2 -游戏玩法分析 II

这道题跟上道题有关系~但是这次看的是device id,所以我们把他的限制放在where里面,还记得前几天的in关键字吗~yes,可以用在这里!

但一定要记得where (player_id, event_date) in 中间两个变量要用括号包起来,我就是没有加括号,error了好几次~~嘻嘻嘻

select player_id, device_id from Activity 

where (player_id, event_date) in

(select player_id, min(event_date) from Activity

group by player_id)

恭喜过关!进入下一关!


关卡3 - 游戏玩法分析 III

思路:(摘自leetcode题解)

这里的精髓是:

and a.event_date >= b.event_date

group by a.player_id, a.event_date

这两句首先是规定了b的date是大于等于a,然后再group by a的date,就很聪明,兔兔respect。

答案:

select a.player_id, a.event_date, sum(b.games_played) as games_played_so_far 

from activity a, activity b

where a.player_id = b.player_id

and a.event_date >= b.event_date

group by player_id, event_date

恭喜过关!进入下一关!


关卡4- 游戏玩法分析 IV

思路:

首先我们要做一个表的连接,我们用inner join来筛选出首次登陆之后第二天也登录的玩家

然后在select语句里,计算我们想要的结果。这里的除数内嵌了一个select,感觉酷酷的!

SELECT ROUND(COUNT(DISTINCT a.player_id) / (SELECT COUNT(DISTINCT player_id) FROM Activity), 2) AS fraction

FROM Activity AS a

INNER JOIN (SELECT player_id, MIN(event_date) AS first_login FROM Activity GROUP BY player_id) AS b

ON a.player_id = b.player_id 

AND DATEDIFF(a.event_date, b.first_login) = 1

恭喜过关!进入下一关!


关卡5-员工奖金

思路:

这道题比较简单,我们就按正常的做,但要注意的点是,null也要被显示。所以我们在后面加or b.bonus is null

select e.name,b.bonus from Employee e

left join Bonus b

on e.empId = b.empId

where b.bonus < 1000

or b.bonus is null

恭喜过关!

今天学到的新知识:where (player_id, event_date) in 中间两个变量要用括号包起来 ;如果有需要,select语句的除数都可以有select;看清题目如果需要null值可以手动加or xxx is null。

明天继续闯关~yay ~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容