Outline
非常希望如果有B- tree觉得至今为止在LeetCode的SQL练习中表现的不咋地的,有必要去看看Advanced的SQL语句的handbook。目前我是停下来看了两遍,因为上周被数据仓库教授的SQL语句逻辑秀瞎了,所以觉得只有从底层清楚这些东西才有熟练和进步的可能。我暂时没有比较出来哪个好用,但是先贴一个还算全的:
🔗SQL Quick Guide
534. Game Play Analysis III <OVER.>
Solution:
主要核心是用到OVER,其支持基于GROUP的聚合值。
SELECT player_id, event_date,
sum(games_played) OVER (partition by player_id order by event_date) AS games_played_so_far
FROM Activity
ORDER BY player_id, event_date ASC
550. Game Play Analysis IV <JOIN.>
不禁感叹刷题最重要的还是思路啊。无非就几种选择——JOIN表,依赖划分。。。
这题一看就应该想到这start date应该可以和event_date并排一起放,设置规则以后LEFT JOIN不满足要求的直接就过滤掉了。
SOLUTION:
SELECT round(count(a2.player_id) / count(a1.player_id), 2) As fraction
FROM(
SELECT player_id, min(event_date) AS start_date
FROM Activity
GROUP BY player_id) AS a1
LEFT JOIN(
SELECT player_id, event_date
FROM Activity
) AS a2
ON a1.player_id = a2.player_id AND event_date = start_date + 1
570. Managers with at Least 5 Direct Reports <JOIN.>
SOLUTION:
我的逻辑最开始想到的是JOIN的写法。刚开始用的是LEFT JOIN,结果一个测试样例结果应为[[ ]],我的跑出来是[[null]]。后面突然想到LEFT JOIN的属性就是就算为null的匹配也要强行怼上去填个null。刚好可以用JOIN,就改成如下,通过。
SELECT name
FROM(
SELECT managerId
FROM Employee
GROUP BY managerId
HAVING count(*) >= 5 ) AS e1
JOIN Employee e ON e1.managerId = e.id
考虑到其实在同一张表里面去限制ID也是绝对可行的,稍微改改(但是其实runtime是增加了的),无JOIN写法如下:
SELECT name
FROM Employee
WHERE id IN(
SELECT managerId
FROM Employee
GROUP BY managerId
HAVING count(*) >= 5
)
580. Count Student Number in Departments <JOIN.>
SOLUTION:
一点都不复杂,就是JOIN的问题,因为两个表链接起来才能获得所有的信息。但是我一开始遇到了很短暂的报错(菜),就是在为0的Architecture显示的基础上为0的Art没有出现在表中。因为我原来GROUP BY里面写的是s.dept_id,如果按照Student来GROUP BY的话,会出现部门缺失着实是见怪不怪。
SELECT d.dept_name, count(s.dept_id) AS student_number
FROM Student s RIGHT JOIN Department d ON s.dept_id = d.dept_id
GROUP BY d.dept_name # 也可写成 GROUP BY 1
ORDER BY student_number DESC # 也可写成 ORDER BY 2 DESC
608. Tree Node <CASE, IS NULL>
这题我喜欢!一方面是正式用到了CASE,让我好歹有了点在coding的感觉。第二,我从来没有注意过IS NULLh和='null’的区别在这里直接彰显出来了。
当我第二行IS NULL写为=‘null’的时候,报错如下:
可见这 = null在这里就匹配不出来东西。参考:数据库查询—is null与= null的区别
讲了一大堆提出上面作者的一句话重点:
null 表示什么也不是, 不能=、>、< … 所有的判断,结果都是false,所有只能用 is null进行判断。
SOLUTION:
思路见注释
SELECT id,
CASE WHEN p_id