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 ~