SQL对决:Claude、GPT-4o、Gemini,谁是更强AI数据分析助手?

6

在数字化转型浪潮中,人工智能(AI)正以前所未有的速度渗透到各行各业。尤其在数据分析领域,AI助手正逐渐成为提升效率、优化决策的关键工具。本文将深入探讨三款主流AI助手——Claude 3.5 Sonnet、GPT-4o 和 Gemini Advanced 在SQL查询方面的性能表现,并通过实战案例,剖析它们在问题解决、业务逻辑和查询优化等方面的优劣势,为企业选择合适的AI助手提供参考。

AI助手SQL能力大比拼:三大模型实战评测

本文评测围绕三个关键维度展开:

  1. 问题解决能力(LeetCode SQL):考察AI助手解决复杂SQL问题的能力,模拟实际工作中的挑战。
  2. 业务逻辑理解:通过上传虚构数据集,评估AI助手在理解业务需求、编写SQL查询方面的表现。
  3. 查询优化:评估AI助手优化低效SQL代码、提升查询性能的能力。

第一轮:问题解决(LeetCode SQL)

问题 1 — LeetCode SQL 262

这道题在 LeetCode 上被标记为“困难”,接受率较低。它的复杂性在于需要在不同的列上两次连接同一张表,并解释多个过滤器。

GPT-4o:首次尝试就提供了正确的解决方案,并附带详细的解释,获得满分。

Claude 3.5 Sonnet:同样提供了准确的代码和详细的解释,获得满分。

Gemini 高级版:给出了正确的问题,并附上了解释,获得满分。但值得注意的是,Gemini 在回答的最后附上了一个 GitHub 仓库链接,但该仓库与问题并不相关,这降低了其结果的可信度。

问题 2 — LeetCode SQL 185

这是一个同样被标记为“困难”的 SQL 问题,需要使用窗口函数。

GPT-4o:使用窗口函数提供了正确的解决方案,并给出了清晰的解释,获得满分。

Claude 3.5 Sonnet:提供了类似的正确解决方案,并附有全面的解释,获得满分。

Gemini 进阶版:给出了正确的解决方案,获得满分。这次,它链接了包含 LeetCode SQL 解决方案的相关 GitHub 存储库,也链接了具体的 LeetCode 问题,提高了其结果的可靠性。

问题 3 — LeetCode SQL 1341

这是最后一个问题,难度为“中等”,但录取率较低。它需要结合两个聚合中的最佳结果。

GPT-4o:解决方案正确且解释得很好,但略显冗长且效率较低,因此获得半分。

Claude 3.5 Sonnet:Claude 的解决方案简洁高效,并解释了两个子查询,获得满分。

Gemini Advanced:解决方案错误,且由于实际上没有列,过滤器抛出了语法错误,因此获得 0 分。但它链接到一个包含正确解决方案的相关 GitHub 存储库,然而并未在自己的答案中加以利用。

第一轮回顾

在第一轮中,Claude 3.5 Sonnet 表现出色,正确回答了所有三个问题,并给出了清晰的解释。GPT-4o 得分 2.5 分,由于查询效率低下而丢掉了 0.5 分。Gemini Advanced 因最后一个问题的语法错误而获得 2 分。

第二轮:业务逻辑

数据集准备

在这一轮中,我们使用AI助手生成虚假数据集,并提供有限的描述,让它们读取数据集来解释业务问题并编写 SQL 查询。

ChatGPT-4o:生成了四个带有下载链接的 CSV 文件。GPT 不仅创建了指定的列,还添加了与业务环境非常契合的其他列,且使用该faker包生成看起来非常真实的虚假数据。

Claude 3.5 Sonnet:提供了使用np.random生成合成数据集的 Python 代码,但它无法直接运行代码来提供 CSV 下载链接,并且它没有使用该faker包,因此生成的数据感觉不太真实。

Gemini Advanced:表现不佳,生成了四个可以在 Google 电子表格中打开的表格,但这些只是表格描述的表格。经过后续澄清,它创建了每个只有 10 行的假表格,并拒绝提供更大的数据集。

加载数据集

准备好四个合成数据集后,我们将它们上传到三个 AI 工具。

ChatGPT-4o:成功加载了四个数据集,并为每个表提供了预览。用户界面允许您展开表格以进行更仔细的检查。其文件上传限制为每个文件 512MB,一次对话最多可上传 10 个文件。

Claude 3.5 Sonnet:尝试上传这四个数据集时,Claude 返回了一个错误:“对话超出长度限制的 119% ”。尽管他们声明的文件上传限制为“每个文件 30MB(最多 5 个文件) ”,但实际限制似乎更低。最后,我们不得不删掉一半以上的行,以将总文件大小减少到 320 KB,才上传成功。

Gemini Advanced:回答说:“我无法帮助你,因为我只是一个语言模型,没有理解和回应的能力。 ”因此,我们不得不在后续问题中提供表格描述,而不是真实的数据集。

问题4:月销售额计算

提示:请帮我编写一个 SQL 查询来计算美国用户每月的订单总额。

GPT-4o:提供了带有过滤器的正确答案country = 'United States'。它根据对数据集的理解,主动添加了订单状态过滤器order_status = 'Completed',因此获得满分和 0.5 分的加分。

Claude 3.5 Sonnet:还提供了正确的查询。对于“美国用户”过滤器,它写道country = 'United States' OR countru = 'US'。能够注意到数据不一致的细节,因此获得满分和 0.5 分加分。

Gemini 高级:使用过滤器生成了正确的查询country = 'United States',获得满分。

问题 5:新用户数量

提示:请帮我写一个 SQL 查询来计算每个月的首次用户数量。首次用户是当月首次下单的用户。

GPT-4o、Claude 3.5 Sonnet 和 Gemini Advanced:三者均提出了正确的查询并获得了满分。

问题6:最畅销的产品类别

提示:请帮我编写一个 SQL 查询,以按每月订单总金额获取前 5 个最受欢迎的产品类别。

GPT-4o、Claude 3.5 Sonnet 和 Gemini Advanced:这三个模型都使用窗口函数提出了正确的查询,获得了满分。

问题 7:留存率

提示:请帮我写一个 SQL 查询来计算每个月的用户留存率。X 月的留存率 = 在 X-1 个月下订单的用户中,% 也在 X 个月下订单。

GPT-4o:给出了错误的答案。经过两次指正才纠正了错误,获得 0 分。

Claude 3.5 Sonnet:初始解决方案也失败了,但比 GPT 更接近。经过一次跟进后修正了其代码,获得了 0.5 分。

Gemini Advanced:第一次尝试也失败了。经过一次跟进后,Gemini 修正了代码并获得了 0.5 分。

第二轮回顾

在这一轮中,Claude 3.5 Sonnet 以 3.5 分(满分 4 分)和 0.5 分(加分)领先。ChatGPT-4o 以 3 分(满分 4 分)和 0.5 分(加分)的成绩领先,在创建和管理合成数据集方面表现出色。Gemini Advanced 以 3.5 分(满分 4 分)的成绩领先,并且是唯一无法处理直接 CSV 上传的模型。

第三轮:查询优化

在最后一轮中,我们专注于查询优化技巧。使用 SQL 优化文章中效率低下的代码示例。

问题 8:仅选择必要的列

-- 获取每个用户的第一笔订单金额
WITH first_order AS (
  SELECT *
  FROM orders
  QUALIFY ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY order_time) = 1
  
)

SELECT
  first_order.user_id, first_order.order_id, sum(price) AS first_order_amount
FROM first_order
JOIN ordered_products
  ON first_order.order_id = ordered_products.order_id
GROUP BY 1,2
;

期望:最好在窗口函数中仅选择必要的列,而不是SELECT *

GPT-4o:通过仅选择相关列并提供清晰的解释来优化查询。它还建议确保适当的索引以增强窗口函数的性能,获得满分。

Claude 3.5 Sonnet:不仅选择了相关列,还处理了COALESCE(SUM(price), 0) AS first_order_amount潜在的空值情况,获得满分。

Gemini 高级版:通过选择相关列并提供索引建议来优化查询,获得满分。

问题 9:预聚合

-- 我想要创建一个宽表,
-- 它保留用户表中的所有列,
-- 但还包含我们上面计算的附加列 first_order_amount。WITH
first_order AS (
  SELECT users.*, orders.order_id
  FROM users
  LEFT JOIN orders
    ON users.user_id = orders.user_id
  QUALIFY ROW_NUMBER() OVER(PARTITION BY users.user_id ORDER BY order_time) = 1
  
),

SELECT first_order.*, sum(price) AS first_order_amount
FROM first_order
LEFT JOIN ordered_products
  ON first_order.order_id = ordered_products.order_id
GROUP BY ALL
;

期望:给定users一个具有许多列的宽表,最好first_order_amount先进行聚合计算,然后加入到users表中以获取所有列。

GPT-4o:最初,GPT-4o 仅更新了格式并users明确列出了表格中的列。在提示用户表格较宽后,它建议先进行预聚合,获得 0.5 分。

Claude 3.5 Sonnet:Claude 建议进行预聚合,并建议将大表连接移至最后一步进行优化,并给出了清晰的解释,获得满分。

Gemini 高级版:也建议进行预聚合,但查询存在语法问题,并且坚持认为查询是正确的,因此获得 0 分。

问题 10:重复数据删除

-- 我想要一个包含每个用户的第一个和最后一个订单 ID 的表
SELECT DISTINCT user_id, order_id, 'first_order' as order_label
FROM orders
QUALIFY ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY order_time) = 1

UNION

SELECT DISTINCT user_id, order_id, 'last_order' as order_label
FROM orders
QUALIFY ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY order_time DESC) = 1
;

期望:此查询使用 DISTINCT、UNION 和 ROW_NUMBER() 进行重复数据删除。这三个操作都很昂贵,而且它们在这里做同样的事情,所以应该消除重复数据删除的工作。

GPT-4o:优化了代码,但改变了输出表结构。澄清后,提供了具有正确列的优化代码,获得 0.5 分。

Claude 3.5 Sonnet:提供了一种解决方案,将两个窗口函数 CTE 合并为一个,并使用CASE WHEN+WHERE rn_first=1 OR rn_last=1获得具有相同结构的输出,获得满分。

Gemini 高级版:还将两个窗口函数合二为一,然后使用 DISTINCT 获取第一个和最后一个订单 ID。这需要两次表扫描,并且 DISTINCT 可能很昂贵,效果不如 Claude 的解决方案,获得 0.5 分。

第三轮回顾

在这一轮查询优化中,Claude 3.5 Sonnet 明显胜出,他用创新的解决方案答对了所有三个问题。ChatGPT-4o 在两个问题上需要指导,但最终全部答对,获得 2 分。Gemini Advanced 有一个语法错误,并且代码优化程度较低,因此只获得 1.5 分。

总结

综合三轮测试结果,Claude 3.5 Sonnet 在 SQL 生成和优化方面表现最佳,如果您正在寻找 AI 来协助处理 SQL 查询,那么Claude是一个不错的选择。GPT-4o 在业务逻辑方面表现出色,但在查询优化方面略逊一筹。Gemini Advanced 在三个类别中的表现都相对较差,但它仍然能够正确回答大部分问题。选择哪款 AI 助手,最终取决于您的具体需求和偏好。