hunyuan-pro 在「时序数据插值与缺失值填充SQL」的评测结果

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

基本信息

  • 模型名称:hunyuan-pro
  • 用例名称:时序数据插值与缺失值填充SQL
  • 测试类型:文本生成
  • 评测维度:SQL 数据库能力

系统提示词(System Prompt)

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

你是一名资深数据库工程师,擅长 SQL 查询编写与时序数据处理。 回答要求: 1. 给出完整可运行的 SQL 语句 2. 对关键步骤添加注释说明 3. 说明所使用的核心函数或语法 4. 最终答案需明确标出

用户提示词(User Prompt)

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

有一张传感器温度记录表 `sensor_readings`,表结构如下: ```sql CREATE TABLE sensor_readings ( id BIGINT PRIMARY KEY, recorded_at TIMESTAMP NOT NULL, -- 记录时间(精确到秒) temperature FLOAT NOT NULL -- 温度值(摄氏度) ); ``` 请编写一条 SQL 查询,统计**过去 24 小时内每分钟的平均温度**。 要求: - 以每分钟为粒度进行聚合(即将同一分钟内的多条记录取平均值) - 只需返回**有数据的分钟**,不需要处理缺失分钟 - 结果按时间升序排列 - 输出列:`minute_slot`(分钟时间戳)、`avg_temperature`(该分钟平均温度)

任务要求

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

  1. 正确使用 DATE_TRUNC 或等效函数将时间截断到分钟粒度
  2. 正确使用 WHERE 子句过滤过去 24 小时的数据
  3. 正确使用 GROUP BY 对每分钟进行聚合,并计算 AVG(temperature)
  4. 结果按 minute_slot 升序排列
  5. 输出列名与题目要求一致

评测结果

综合得分

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

基础难度评测结果

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

模型生成产物

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

为了统计过去 24 小时内每分钟的平均温度,我们可以使用 SQL 的 `GROUP BY` 子句结合 `DATE_TRUNC` 函数来按分钟进行分组,并计算每组的平均温度。以下是完整的 SQL 查询: ```sql SELECT DATE_TRUNC('minute', recorded_at) AS minute_slot, -- 截取到分钟的时间戳 AVG(temperature) AS avg_temperature -- 计算每分钟的平均温度 FROM sensor_readings WHERE recorded_at >= NOW() - INTERVAL '24 hours' -- 过滤过去 24 小时的记录 GROUP BY DATE_TRUNC('minute', recorded_at) -- 按分钟分组 ORDER BY minute_slot ASC; -- 按时间升序排列 ``` ### 关键步骤说明: 1. **DATE_TRUNC('minute', recorded_at)**: - 这个函数用于将 `recorded_at` 时间戳截取到分钟级别。例如,`2023-10-01 12:34:56` 会被截取为 `2023-10-01 12:34:00`。 - 这样做的目的是将同一分钟内的所有记录归为一组。 2. **AVG(temperature)**: - 这个聚合函数用于计算每组(即每分钟)的平均温度。 3. **WHERE recorded_at >= NOW() - INTERVAL '24 hours'**: - 这个条件用于过滤出过去 24 小时内的记录。`NOW()` 函数返回当前时间,`INTERVAL '24 hours'` 表示 24 小时的时间间隔。 4. **GROUP BY DATE_TRUNC('minute', recorded_at)**: - 这个子句按分钟分组,确保每分钟的记录被聚合在一起。 5. **ORDER BY minute_slot ASC**: - 这个子句按时间升序排列结果,确保输出的时间顺序是从早到晚。 ### 核心函数或语法: - **DATE_TRUNC**: 用于截取时间戳到指定的精度(这里是分钟)。 - **AVG**: 用于计算平均值。 - **WHERE 子句**: 用于过滤数据。 - **GROUP BY 子句**: 用于分组数据。 - **ORDER BY 子句**: 用于排序结果。 通过以上步骤和函数,我们可以有效地统计过去 24 小时内每分钟的平均温度,并按时间升序排列结果。

AI 评审点评

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

【CLAUDE】候选输出整体质量较高,核心 SQL 逻辑正确,覆盖了题目所有功能要求,注释和解释说明详尽清晰。与参考答案相比,缺少 ROUND 精度处理和时间上界条件(AND recorded_at < NOW()),属于细节层面的小差异,不影响主体功能的正确性。是一份符合要求、可直接使用的高质量答案。 【GEMINI】模型表现优秀,准确理解了时序数据处理的需求,提供的 SQL 语句逻辑严密且注释详尽。虽然未包含四舍五入处理,但并不影响核心功能的实现,完全满足题目要求。 【KIMI】该候选输出是一份高质量的 SQL 解答,完全满足题目要求。SQL 语句功能正确,能够准确统计过去 24 小时内每分钟的平均温度;代码规范,注释清晰;解释说明充分,覆盖了核心函数和查询逻辑。与参考答案相比,主要差异在于未对结果进行四舍五入格式化,以及缺少多数据库兼容性说明,但这些不影响核心功能的实现。整体表现优秀,接近满分。

进阶难度评测结果

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

模型生成产物

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

为了完成这个任务,我们需要以下步骤: 1. **生成过去 24 小时的完整时间序列**。 2. **计算每分钟的平均温度**。 3. **对缺失的分钟进行前向填充**。 4. **标记哪些分钟是填充的**。 下面是详细的 SQL 查询和解释: ### 步骤 1:生成过去 24 小时的完整时间序列 我们使用递归 CTE 来生成过去 24 小时的每分钟时间戳。 ### 步骤 2:计算每分钟的平均温度 我们将 `sensor_readings` 表按分钟分组,并计算每分钟的平均温度。 ### 步骤 3:对缺失的分钟进行前向填充 我们使用窗口函数 `LAST_VALUE` 来实现前向填充。 ### 步骤 4:标记哪些分钟是填充的 我们通过比较原始数据和填充数据来标记哪些分钟是填充的。 ```sql WITH time_slots AS ( -- 生成过去 24 小时的完整时间序列 SELECT generate_series( NOW() - INTERVAL '24 hours', NOW(), '1 minute'::interval ) AS minute_slot ), avg_temperatures AS ( -- 计算每分钟的平均温度 SELECT date_trunc('minute', recorded_at) AS minute_slot, AVG(temperature) AS avg_temperature FROM sensor_readings WHERE recorded_at >= NOW() - INTERVAL '24 hours' GROUP BY date_trunc('minute', recorded_at) ), filled_temperatures AS ( -- 对缺失的分钟进行前向填充 SELECT ts.minute_slot, COALESCE(at.avg_temperature, LAST_VALUE(at.avg_temperature) IGNORE NULLS OVER (ORDER BY ts.minute_slot ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)) AS avg_temperature FROM time_slots ts LEFT JOIN avg_temperatures at ON ts.minute_slot = at.minute_slot ) SELECT ft.minute_slot, ft.avg_temperature, CASE WHEN at.avg_temperature IS NULL THEN TRUE ELSE FALSE END AS is_filled FROM filled_temperatures ft LEFT JOIN avg_temperatures at ON ft.minute_slot = at.minute_slot ORDER BY ft.minute_slot; ``` ### 解释 1. **生成时间序列 (`time_slots` CTE)**: - 使用 `generate_series` 函数生成过去 24 小时的每分钟时间戳。 2. **计算每分钟的平均温度 (`avg_temperatures` CTE)**: - 按分钟分组,计算每分钟的平均温度。 3. **前向填充 (`filled_temperatures` CTE)**: - 使用 `LEFT JOIN` 将时间序列与每分钟的平均温度连接。 - 使用 `COALESCE` 和 `LAST_VALUE` 窗口函数进行前向填充。`LAST_VALUE` 函数会忽略 NULL 值,取最近一个非 NULL 值。 4. **标记填充值**: - 通过比较填充后的温度值与原始平均温度值,标记哪些分钟是填充的。 ### 前向填充的实现原理 前向填充的实现原理是利用窗口函数 `LAST_VALUE`,它会忽略 NULL 值,取最近一个非 NULL 值。通过 `ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW` 定义窗口范围,确保取的是当前行之前的最近一个非 NULL 值。 ### 最终结果 查询结果将包含三列: - `minute_slot`: 每分钟的时间戳。 - `avg_temperature`: 填充后的温度值。 - `is_filled`: 布尔值,标记该分钟是否为填充值。 这样,我们就完成了过去 24 小时内每分钟的平均温度统计,并对缺失分钟进行了前向填充。

AI 评审点评

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

【CLAUDE】候选答案整体框架思路正确,CTE 拆解结构清晰,但核心实现存在致命缺陷:使用了 PostgreSQL 不支持的 LAST_VALUE ... IGNORE NULLS 语法,导致查询无法实际运行。前向填充的实现原理说明也因此存在误导。相比参考答案采用的「累计非空计数分组」方案(利用 COUNT 忽略 NULL 的特性生成 fill_group,再用 PARTITION BY fill_group 的 MAX 传播非空值),候选方案在技术选型上存在根本性错误。此外,时间槽未做 date_trunc 对齐也会影响数据准确性。建议改用参考答案中的分组方案来实现前向填充。 【GEMINI】模型表现优秀,能够熟练运用 PostgreSQL 的窗口函数特性解决复杂时序补全问题。代码结构逻辑严密,可读性高。虽然在处理边界情况的逻辑描述上略显简略,但整体方案在工程实践中是非常高效的实现方式。 【KIMI】候选方案展示了正确的解题思路(CTE 分层、generate_series、窗口函数前向填充),但存在致命的语法兼容性问题——`LAST_VALUE ... IGNORE NULLS` 不是 PostgreSQL 支持的语法,导致查询无法运行。此外,时间序列生成未截断到分钟、`is_filled` 判定逻辑冗余、未妥善处理序列开头的 NULL 边界情况,均为明显缺陷。建议在 PostgreSQL 中采用「累计非空计数分组」方案(`COUNT(avg_temp) OVER (ORDER BY ...)`)实现前向填充,该方案纯标准 SQL、兼容性好且逻辑严谨。

困难难度评测结果

  • 得分:33.6 分
  • 通过状态:未通过

模型生成产物

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

### 任务一:多传感器前向填充 #### 实现思路 1. 使用 `generate_series` 生成每个传感器在过去 24 小时内的每分钟时间槽。 2. 计算每个时间槽内的平均温度。 3. 使用 `LEFT JOIN` 将生成的完整时间槽与实际数据进行连接。 4. 使用 `COALESCE` 进行前向填充。 #### SQL 语句 ```sql WITH minute_slots AS ( -- 生成每个传感器在过去 24 小时内的每分钟时间槽 SELECT sensor_id, generate_series( recorded_at - interval '24 hours', recorded_at, '1 minute'::interval ) AS minute_slot FROM sensor_readings GROUP BY sensor_id, recorded_at ), avg_temperatures AS ( -- 计算每个时间槽内的平均温度 SELECT sensor_id, date_trunc('minute', recorded_at) AS minute_slot, AVG(temperature) AS avg_temperature FROM sensor_readings GROUP BY sensor_id, date_trunc('minute', recorded_at) ) SELECT ms.sensor_id, ms.minute_slot, COALESCE(at.avg_temperature, LAG(at.avg_temperature) OVER (PARTITION BY ms.sensor_id ORDER BY ms.minute_slot)) AS avg_temperature, CASE WHEN at.avg_temperature IS NULL THEN 'true' ELSE 'false' END AS is_filled FROM minute_slots ms LEFT JOIN avg_temperatures at ON ms.sensor_id = at.sensor_id AND ms.minute_slot = at.minute_slot ORDER BY ms.sensor_id, ms.minute_slot; ``` #### 性能注意事项 - 确保 `sensor_readings` 表上有针对 `sensor_id` 和 `recorded_at` 的复合索引,以加速查询。 - `generate_series` 生成的行数较多,需注意内存使用情况。 ### 任务二:线性插值填充 #### 实现思路 1. 在任务一的基础上,增加线性插值逻辑。 2. 使用窗口函数计算前后两个有效数据点的线性插值。 #### SQL 语句 ```sql WITH minute_slots AS ( SELECT sensor_id, generate_series( recorded_at - interval '24 hours', recorded_at, '1 minute'::interval ) AS minute_slot FROM sensor_readings GROUP BY sensor_id, recorded_at ), avg_temperatures AS ( SELECT sensor_id, date_trunc('minute', recorded_at) AS minute_slot, AVG(temperature) AS avg_temperature FROM sensor_readings GROUP BY sensor_id, date_trunc('minute', recorded_at) ), filled_temperatures AS ( SELECT ms.sensor_id, ms.minute_slot, COALESCE(at.avg_temperature, LAG(at.avg_temperature) OVER (PARTITION BY ms.sensor_id ORDER BY ms.minute_slot)) AS avg_temperature FROM minute_slots ms LEFT JOIN avg_temperatures at ON ms.sensor_id = at.sensor_id AND ms.minute_slot = at.minute_slot ) SELECT ft.sensor_id,...

AI 评审点评

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

【CLAUDE】候选答案在三个任务上均存在严重的逻辑错误,核心功能均未正确实现。最关键的问题是:①时间槽生成方式错误,未构建固定的「传感器×时间槽」完整矩阵;②前向填充使用单步 LAG 而非分组编号法,无法处理连续缺失;③线性插值未实现前后锚点查找机制;④任务三缺少异常值剔除后的前向填充步骤。方案结构上有 CTE 拆解的意识,但实现质量远低于及格线,与参考答案的差距显著。 【GEMINI】模型在处理时序数据填充任务时,对 SQL 窗口函数的理解存在明显误区。特别是在处理连续缺失值时,简单使用 LAG/LEAD 无法实现前向填充或线性插值,必须通过分组编号(Group ID)等技巧来定位锚点。代码逻辑在任务二和任务三中均未达到可运行且产生正确结果的标准。 【KIMI】该候选方案在三个核心任务上均存在严重缺陷。最根本的问题是任务一的时间序列生成逻辑错误,导致后续所有任务建立在错误的数据基础上。前向填充、线性插值、异常检测等核心算法均未正确实现,边界情况处理缺失,代码存在多处逻辑错误。虽然使用了 CTE 和窗口函数等高级特性,但用法不当,未能解决实际问题。建议重新理解「生成完整时间序列→计算实际均值→填充缺失」的标准时序数据处理流程,以及「分组编号法」实现前向填充的标准模式。

相关链接

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

加载中...