Google: Gemma 4 26B A4B 在「多表关联与窗口函数综合查询」的评测结果

这是该 AI 模型在此测试用例上的详细评测结果。

基本信息

  • 模型名称:Google: Gemma 4 26B A4B
  • 用例名称:多表关联与窗口函数综合查询
  • 测试类型:文本生成
  • 评测维度:SQL 数据库能力

系统提示词(System Prompt)

这是给 AI 模型的背景设定和角色指令:

你是一名资深数据库工程师,擅长编写清晰、高效的 SQL 查询。 回答要求: 1. 给出完整可执行的 SQL 语句 2. 对关键子句添加注释说明用途 3. 使用规范的 SQL 格式(关键字大写,适当缩进) 4. 最终查询结果字段要有明确的别名

用户提示词(User Prompt)

这是用户给 AI 模型的具体任务要求:

现有如下电商数据库表结构: ```sql -- 商品表 CREATE TABLE products ( product_id INT PRIMARY KEY, product_name VARCHAR(100), category_id INT ); -- 订单明细表 CREATE TABLE order_items ( order_id INT, product_id INT, quantity INT, unit_price DECIMAL(10,2) ); ``` 请编写一条 SQL 查询,统计每个商品的总销售额(quantity × unit_price 之和),并按总销售额从高到低排序,返回以下字段: - product_id - product_name - category_id - total_sales(总销售额) 只需返回总销售额大于 0 的商品。

任务要求

AI 模型需要满足以下要求:

  1. 正确使用 JOIN 将 products 与 order_items 关联
  2. 正确计算总销售额:SUM(quantity * unit_price)
  3. 使用 GROUP BY 按商品分组
  4. 使用 HAVING 或 WHERE 过滤总销售额大于 0 的记录
  5. 结果按总销售额降序排列,字段别名清晰

评测结果

综合得分

该模型在此用例的得分为:94.3 分(满分 100 分),已通过

基础难度评测结果

  • 得分:94.3 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

你好!作为一名数据库工程师,针对你的需求,我编写了如下 SQL 查询。 为了保证查询的高效性,我使用了 `INNER JOIN` 来关联商品表和订单明细表,并通过 `GROUP BY` 进行聚合计算。 ```sql SELECT p.product_id, p.product_name, p.category_id, -- 计算每个商品的销售总额:单价 * 数量 的累加 SUM(oi.quantity * oi.unit_price) AS total_sales FROM products AS p INNER JOIN order_items AS oi ON p.product_id = oi.product_id -- 通过商品ID关联两张表 GROUP BY p.product_id, p.product_name, p.category_id HAVING -- 过滤条件:仅保留总销售额大于 0 的商品 SUM(oi.quantity * oi.unit_price) > 0 ORDER BY -- 按总销售额从高到低降序排列 total_sales DESC; ``` ### 查询逻辑说明: 1. **JOIN 策略**:使用 `INNER JOIN`。因为我们的目标是统计“已销售”的商品,如果某个商品在 `order_items` 中没有记录,它不会出现在结果集中,这符合“总销售额大于 0”的隐含逻辑。 2. **聚合计算**:使用 `SUM(quantity * unit_price)` 对每一组商品进行金额累加。 3. **分组依据 (GROUP BY)**:在 SQL 标准中,当使用聚合函数时,`SELECT` 列表中所有非聚合字段(`product_id`, `product_name`, `category_id`)都必须包含在 `GROUP BY` 子句中,以确保结果集的确定性。 4. **过滤机制 (HAVING vs WHERE)**: * 由于 `total_sales` 是通过聚合函数计算得出的结果,因此必须使用 `HAVING` 子句进行过滤,而不能使用 `WHERE`(`WHERE` 作用于分组前的行)。 5. **排序 (ORDER BY)**:使用 `DESC` 关键字实现从高到低的降序排列。

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【GEMINI】模型生成的 SQL 语句非常专业且高效。逻辑上严丝合缝,准确处理了聚合过滤(HAVING)和多表关联。代码格式规范,注释详尽,能够直接投入生产环境使用。虽然在原生字段的显式别名上稍显简略,但不影响整体的高质量表现。 【KIMI】整体而言,这是一个高质量的SQL查询。逻辑正确,能够返回预期的结果。书写规范,注释清晰,可读性较好。只是在一些细节上还有改进空间,如注释中的HTML实体和HAVING子句的简化。

进阶难度评测结果

  • 得分:94.3 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

你好!作为一名资深数据库工程师,针对你的需求,我采用了 **CTE(公用表表达式)** 结构来构建查询逻辑。这种方式将“数据聚合”、“排名计算”与“结果过滤”三个逻辑阶段解耦,不仅提高了代码的可读性,也方便后续的维护与性能调优。 以下是完整的 SQL 实现方案: ```sql WITH ProductSales AS ( -- 第一步:聚合订单明细,计算每个商品的销售总额 -- 通过关联 products 和 order_items 表,将销售数据汇总到商品维度 SELECT p.product_id, p.product_name, p.category_id, SUM(oi.quantity * oi.unit_price) AS total_sales FROM products p JOIN order_items oi ON p.product_id = oi.product_id GROUP BY p.product_id, p.product_name, p.category_id ), CategoryRanking AS ( -- 第二步:关联类目表,并利用窗口函数计算类目内的销售排名 -- 使用 DENSE_RANK() 处理可能存在的销售额并列情况(若需严格跳过排名可用 RANK()) SELECT c.category_name, ps.product_name, ps.total_sales, DENSE_RANK() OVER ( PARTITION BY ps.category_id ORDER BY ps.total_sales DESC ) AS sales_rank FROM ProductSales ps JOIN categories c ON ps.category_id = c.category_id ) -- 第三步:从计算好的排名结果中,筛选出每个类目排名前 3 的商品 -- 并按照要求的业务逻辑进行最终排序 SELECT category_name, product_name, total_sales, sales_rank FROM CategoryRanking WHERE sales_rank <= 3 ORDER BY category_name ASC, sales_rank ASC; ``` ### 工程师的技术笔记 (Technical Notes): 1. **逻辑拆解说明**: * **`ProductSales` CTE**: 这一层完成了最基础的 `JOIN` 与 `GROUP BY` 操作。在处理大数据量时,先进行聚合(Aggregation)可以有效减少后续步骤需要处理的数据行数。 * **`CategoryRanking` CTE**: 这一层引入了窗口函数 `DENSE_RANK()`。我选择了 `DENSE_RANK` 而不是 `ROW_NUMBER`,是因为在电商场景下,如果两个商品销售额完全一致,通常认为它们并列排名,且不应跳过后续的排名序号。 * **最终查询**: 窗口函数不能直接在 `WHERE` 子句中使用,因此必须先在 CTE 中计算出 `sales_rank`,然后在最外层进行过滤。 2. **性能优化建议**: * **索引建议**:为了优化该查询,建议在 `order_items.product_id` 上建立索引,在 `products.category_id` 上建立索引,以加速 `JOIN` 操作。 * **复杂度分析**:该查询的时间复杂度主要取决于 `order_items` 表的大小以及 `GROUP BY` 操作。 3. **字段语义化**: * 所有输出字段均严格遵循了你的需求,并使用了清晰的别名(如 `total_sales`, `sales_rank`),确保报表输出直接可用。

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【GEMINI】这是一份非常专业的 SQL 编写示例。模型不仅准确地完成了复杂的业务逻辑(聚合+窗口函数+过滤),还通过合理的 CTE 拆分展现了良好的工程实践。代码格式规范,注释详尽,技术笔记中对 DENSE_RANK 的选择和索引优化的建议进一步提升了结果的质量。 【KIMI】候选人的整体表现很好,SQL逻辑正确,代码结构清晰,返回了所有要求字段并正确排序。主要扣分点在于窗口函数的选择上与参考答案略有不同,但整体上是一个高质量的SQL查询。

困难难度评测结果

  • 得分:95.5 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

```sql WITH base_sales_data AS ( /* 第一层 CTE: 基础数据清洗与聚合 职责:过滤符合条件的订单(已完成且在2024年),关联商品与类目, 并按商品维度计算每个商品的销售总额。 */ SELECT c.category_name, p.product_id, p.product_name, c.category_id, SUM(oi.quantity * oi.unit_price) AS product_total_sales FROM orders o JOIN order_items oi ON o.order_id = oi.order_id JOIN products p ON oi.product_id = p.product_id JOIN categories c ON p.category_id = c.category_id WHERE o.status = 'completed' AND o.order_date >= '2024-01-01' AND o.order_date <= '2024-12-31' GROUP BY c.category_name, p.product_id, p.product_name, c.category_id ), ranked_and_avg_sales AS ( /* 第二层 CTE: 窗口函数计算 职责: 1. 使用 RANK() 计算商品在所属类目内的销售额排名。 2. 使用 AVG() OVER() 计算所属类目的平均销售额(基于该类目下所有有销售记录的商品)。 */ SELECT category_name, product_name, product_total_sales, RANK() OVER ( PARTITION BY category_id ORDER BY product_total_sales DESC ) AS sales_rank, AVG(product_total_sales) OVER ( PARTITION BY category_id ) AS category_avg_sales FROM base_sales_data ), filtered_top_products AS ( /* 第三层 CTE: 业务逻辑过滤 职责:仅保留每个类目中销售额排名前 3 的商品。 */ SELECT category_name, product_name, product_total_sales, sales_rank, category_avg_sales FROM ranked_and_avg_sales WHERE sales_rank <= 3 ) /* 最终查询层: 职责:格式化数值,计算偏差百分比,并按要求进行最终排序。 */ SELECT category_name, product_name, ROUND(product_total_sales, 2) AS total_sales, sales_rank, ROUND(category_avg_sales, 2) AS category_avg_sales, ROUND( ((product_total_sales - category_avg_sales) / category_avg_sales) * 100, 2 ) AS deviation_pct FROM filtered_top_products ORDER BY category_name ASC, sales_rank ASC; ``` ### 边界情况说明 **关于并列第 3 名的处理:** 若某类目内有多个商品销售额并列第 3 名,由于使用了 `RANK()` 函数,这些商品都会被标记为 `sales_rank = 3`,并且由于 `RANK()` 的特性,下一名的名次会跳过(例如出现 1, 2, 3, 3, 5 的情况)。在 `WHERE sales_rank <= 3` 的过滤条件下,**所有并列第 3 名的商品都会被包含在最终结果中**。 **处理的合理性:** 这种处理方式在业务分析中是合理的,因为它遵循了“并列即同等地位”的原则,确保了没有任何一个在销售贡献上与第 3 名完全相同的商品被错误地排除在“Top 3”名单之外,保证了数据的公平性。

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【GEMINI】这是一份标准且高质量的 SQL 实现。模型不仅准确理解了复杂的业务需求,还通过清晰的 CTE 结构展示了极佳的代码工程化能力。对于窗口函数的运用十分熟练,边界情况的解释也非常到位,完全符合资深数据库工程师的水平。 【KIMI】整体而言,这条SQL语句在功能实现、结构清晰度、完整性、边界分析等方面都做得相当不错。只是在计算类目平均销售额时存在一处小错误,应使用PARTITION BY category_name而不是category_id。除此之外,这条SQL语句很好地满足了题目要求,体现了较高的SQL编写能力。

相关链接

您可以通过以下链接查看更多相关内容:

加载中...