ChatGPT、Claude 和 Gemini 在数据分析方面的比较(第一部分)

欢迎来到雲闪世界测试哪个 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:解决方案正确且解释得很好,尽管有点冗长且效率低下。MaxUserMaxMovieCTE 是多余的。请参阅下面 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.movi​​e_id = m.movi​​e_id 
    WHERE 
        mr.created_at BETWEEN '2020-02-01' AND '2020-02-29' 
    GROUP BY 
        m.movi​​e_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.movi​​e_id) DESC, name 
LIMIT 1) 

UNION ALL 

(SELECT title AS results 
FROM Movies m 
JOIN MovieRating mr ON m.movi​​e_id = mr.movi​​e_id 
WHERE EXTRACT(YEAR_MONTH FROM mr.created_at) = 202002 
GROUP BY m.movi​​e_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_resultsmovie_rank

<span style="color:rgba(0, 0, 0, 0.8)"><span style="background-color:#ffffff"><span style=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值