刷LeetCode的SQL题库全记录【Medium篇】

本文记录了作者在LeetCode上刷中级SQL题目的过程,涵盖多个题目,如Game Play Analysis系列,Managers with Direct Reports等,探讨了JOIN、OVER、CASE、DISTINCT等关键概念,并分享了在解决复杂SQL问题时的思考和解决方案。
摘要由CSDN通过智能技术生成

非常希望如果有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 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dear Slim.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值