欢迎来到雲闪世界测试哪个 AI 助手能写出最好的 SQL 的十个问题
第一轮:问题解决(LeetCode SQL)
问题 1 — LeetCode SQL 262
我之所以选择这道题,是因为它在 LeetCode 上被标记为“困难”,接受率低至 36.5%。它的复杂性来自于在不同的列上两次连接同一张表并解释多个过滤器。
GPT-4o:GPT 第一次尝试就提供了正确的解决方案,并提供了详细的解释。可获得满分。
Claude 3.5 Sonnet:Claude 提供了准确的代码和详细的解释。可获得满分。
<span style="color:rgba(0, 0, 0, 0.8)"><span style="background-color:#ffffff"><span style="background-color:#f9f9f9"><span style="color:#242424">- 参考 Claude 的答案
SELECT
t.request_at AS Day,
ROUND(
SUM(CASE
WHEN t.status = 'cancelled_by_driver' OR t.status = 'cancelled_by_client'
THEN 1
ELSE 0
END) / COUNT(*),
2
) AS '取消率'
FROM
Trips t
JOIN
Users uc ON t.client_id = uc.users_id
JOIN
Users ud ON t.driver_id = ud.users_id
WHERE
uc.banned = 'No'
AND ud.banned = 'No'
AND t.request_at BETWEEN '2013-10-01' AND '2013-10-03'
GROUP BY
t.request_at</span></span></span></span>
Gemini 高级版:Gemini 还给出了正确的问题并附上了解释,获得了满分。有趣的是,它在回答的最后附上了一个 GitHub 仓库。Gemini 似乎不仅根据其“知识”生成问题,还会搜索互联网。然而,它链接的仓库是一个随机的 Java LeetCode 练习仓库,其中甚至没有包含这个 SQL 问题……我认为链接搜索结果可以提高可信度。但如果结果不相关,嗯?🤔
Gemini 链接了一个随机的 GitHub 仓库(图片来自作者)
问题 2 — LeetCode SQL 185
这也是一个“困难”的 SQL 问题,需要一个窗口函数。
GPT-4o:GPT 使用窗口函数提供了正确的解决方案,并给出了清晰的解释。可获得满分。
<span style="color:rgba(0, 0, 0, 0.8)"><span style="background-color:#ffffff"><span style="background-color:#f9f9f9"><span style="color:#242424">-- 参考 GPT 的解决方案
WITH RankedSalaries AS (
SELECT
e.id,
e.name,
e.salary,
e.departmentId,
d.name AS Department,
DENSE_RANK() OVER (PARTITION BY e.departmentId ORDER BY e.salary DESC) AS salary_rank
FROM
Employee e
JOIN
Department d ON e.departmentId = d.id
)
SELECT
Department,
Name AS Employee,
salary AS Salary
FROM
RankedSalaries
WHERE
salary_rank <= 3
ORDER BY
Department, salary DESC, Name;</span></span></span></span>
Claude 3.5 Sonnet:Claude 也提供了类似的正确解决方案,并附有全面的解释。可获得满分。
Gemini 进阶版:Gemini 给出了正确的解决方案,获得了满分。这次,它既链接了包含 LeetCode SQL 解决方案的相关 GitHub 存储库,也链接了具体的 LeetCode 问题。我很高兴它没有犯同样的错误。
Gemini 链接了相关的 GitHub repo 和正确的 LeetCode 问题(图片来自作者)
问题 3 — LeetCode SQL 1341
我选的最后一个问题是“中等”难度的问题,但它的录取率很低,只有 40.1%。它需要结合两个聚合中的最佳结果。
GPT-4o:解决方案正确且解释得很好,尽管有点冗长且效率低下。MaxUser
和MaxMovie
CTE 是多余的。请参阅下面 Claude 的简洁解决方案。因此,我给它半分。
<span style="color:rgba(0, 0, 0, 0.8)"><span style="background-color:#ffffff"><span style="background-color:#f9f9f9"><span style="color:#242424">-- GPT 的解决方案
WITH UserRatings AS(
SELECT
u.name AS user_name,
COUNT(*) AS ratings_count
FROM
MovieRating mr
JOIN
Users u ON mr.user_id = u.user_id
GROUP BY
u.user_id
),
MovieRatingsInFeb2020 AS(
SELECT
m.title,
AVG(mr.rating) AS avg_rating
FROM
MovieRating mr
JOIN
Movies m ON mr.movie_id = m.movie_id
WHERE
mr.created_at BETWEEN '2020-02-01' AND '2020-02-29'
GROUP BY
m.movie_id
),
MaxUser AS(
SELECT
user_name
FROM
UserRatings
WHERE
ratings_count = (SELECT MAX(rating_count) FROM UserRatings)
ORDER BY
user_name
LIMIT 1
),
MaxMovie AS(
SELECT
title
FROM
MovieRatingsInFeb2020
WHERE
avg_rating = (SELECT MAX(avg_rating) FROM MovieRatingsInFeb2020)
ORDER BY
title
LIMIT 1
)
SELECT user_name AS results FROM MaxUser
UNION ALL
SELECT title AS results FROM MaxMovie;</span></span></span></span>
Claude 3.5 Sonnet:Claude 的解决方案简洁高效,并解释了两个子查询。可得满分。
<span style="color:rgba(0, 0, 0, 0.8)"><span style="background-color:#ffffff"><span style="background-color:#f9f9f9"><span style="color:#242424">--Claude 的解决方案
(SELECT name AS results
FROM Users u
JOIN MovieRating mr ON u.user_id = mr.user_id
GROUP BY u.user_id
ORDER BY COUNT(DISTINCT mr.movie_id) DESC, name
LIMIT 1)
UNION ALL
(SELECT title AS results
FROM Movies m
JOIN MovieRating mr ON m.movie_id = mr.movie_id
WHERE EXTRACT(YEAR_MONTH FROM mr.created_at) = 202002
GROUP BY m.movie_id
ORDER BY AVG(mr.rating) DESC, title
LIMIT 1);</span></span></span></span>
Gemini Advanced :不幸的是,Gemini 的解决方案是错误的。由于实际上没有列,因此过滤器WHERE user_rank=1 OR movie_rank=1
抛出了语法错误。有趣的是,它链接到一个包含正确解决方案的相关 GitHub 存储库,但它并没有在自己的答案中利用这一点。(所以即使它搜索互联网,它也不会使用搜索结果中的解决方案?我很困惑……)combined_results
movie_rank
<span style="color:rgba(0, 0, 0, 0.8)"><span style="background-color:#ffffff"><span style=