You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google SQL面试题:奇偶测量值求和查询未通过,求排查指导

SQL查询排查:Google传感器奇偶次测量值求和问题

问题背景

我在Datalemur平台学习SQL查询时,遇到一道Google传感器测量值的面试题。自己编写的查询能输出预期结果,但无法通过平台验收标准,请求帮忙排查潜在问题。

题目要求

该题与《Ace the Data Science Interview》SQL章节第28题一致,需从存储传感器多日多次测量数据的measurements表中,按日期分别计算当日奇数次(第1、3、5次等)和偶数次(第2、4、6次等)测量值的总和,并分两列展示结果。2023年4月15日起,题目及参考答案已修订。

表结构

列名类型
measurement_idinteger
measurement_valuedecimal
measurement_timedatetime

示例输入

measurement_idmeasurement_valuemeasurement_time
1312331109.5107/10/2022 09:00:00
1352111662.7407/10/2022 11:00:00
5235421246.2407/10/2022 13:15:00
1435621124.5007/11/2022 15:00:00
3464621234.1407/11/2022 16:45:00

示例输出

measurement_dayodd_sumeven_sum
07/10/2022 00:00:002355.751662.74
07/11/2022 00:00:001124.501234.14

说明

2022年7月10日,奇数次测量值总和为2355.75,偶数次为1662.74;2022年7月11日仅有两次测量,奇数次总和1124.50,偶数次总和1234.14。

我的查询代码

WITH cte AS (
    SELECT
        e.measurement_id,
        e.measurement_value,
        to_char(CAST(e.measurement_time AS DATE),
                'MM/DD/YYYY HH24:MI:SS') AS sdt,
        ROW_NUMBER()
        OVER(PARTITION BY to_char(CAST(e.measurement_time AS DATE),
                                  'MM/DD/YYYY HH24:MI:SS')
             ORDER BY
                 e.measurement_id
        )                                AS rnk
    FROM
        measurements e
), get_odd_data AS (
    SELECT
        sdt,
        SUM(measurement_value) AS odd_values
    FROM
        cte
    WHERE
        mod(rnk, 2) != 0
    GROUP BY
        sdt
    ORDER BY
        sdt
), get_even_data AS (
    SELECT
        sdt,
        SUM(measurement_value) AS even_values
    FROM
        cte
    WHERE
        mod(rnk, 2) = 0
    GROUP BY
        sdt
    ORDER BY
        sdt
)
SELECT
    o.sdt,
    o.odd_values,
    e.even_values
FROM
         get_odd_data o
    JOIN get_even_data e ON o.sdt = e.sdt
ORDER BY
        o.sdt;

排查关键点

  1. 排序逻辑偏差:题目中奇偶次测量是按measurement_time的先后顺序划分,但你的代码用measurement_id作为ROW_NUMBER()的排序依据。若measurement_id的生成顺序与测量时间不一致,会直接导致奇偶次分组错误。
  2. 数据丢失风险:使用JOIN会过滤掉仅存在奇数次或仅存在偶数次测量的日期(比如某一天只有1次测量),这类日期的对应求和列应显示为NULL或0,但你的查询会直接丢弃这些数据,不符合题目要求。
  3. 输出列名不匹配:示例输出的日期列名为measurement_day,但你的查询输出列名为sdt,可能不符合平台的输出格式要求。
  4. 日期处理不够严谨:将日期转换为字符串进行分区和分组,可能因SQL方言的格式化差异引发问题。建议直接用DATE(measurement_time)获取日期类型进行分区,再统一格式化输出,避免字符串处理的潜在误差。

内容的提问来源于stack exchange,提问作者stackoverflowquestion54 develo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 02:07:51