奇数和偶数测量 [Google SQL 面试问题] - 解决方案被拒绝

问题描述 投票:0回答:1

我目前正在学习在 Datalemur 平台上制定查询。

遇到特定问题后,我努力制定了一个解决方案,成功地产生了所需的输出。遗憾的是,尽管达到了预期的结果,但我的解决方案未能达到验收标准。

我正在寻求有关我的查询中可能导致其不被接受的潜在缺陷的指导。

问题集:https://datalemur.com/questions/odd-even-measurements

问题:

这与 Ace the Data Science Interview 的 SQL 章节中的问题 #28 是同一个问题!

假设您收到一张表格,其中包含多天内从 Google 传感器获得的测量值,并且每天进行多次测量。

编写一个查询来分别计算特定日期奇数和偶数测量值的总和,并将结果显示在两个不同的列中。请参阅下面的示例输出以了解所需的格式。

定义:

一天内,第 1、3、5 次测量值被视为奇数测量值,第 2、4、6 次测量值被视为偶数测量值。 自2023年4月15日起,该问题的问题和解决方案已进行修订。

measurements Table:
Column Name Type
measurement_id  integer
measurement_value   decimal
measurement_time    datetime

测量示例输入:

measurement_id  measurement_value   measurement_time
131233  1109.51 07/10/2022 09:00:00
135211  1662.74 07/10/2022 11:00:00
523542  1246.24 07/10/2022 13:15:00
143562  1124.50 07/11/2022 15:00:00
346462  1234.14 07/11/2022 16:45:00

示例输出:

measurement_day odd_sum even_sum
07/10/2022 00:00:00 2355.75 1662.74
07/11/2022 00:00:00 1124.50 1234.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;
postgresql oracle
1个回答
0
投票

我刚刚删除了 to_char 并使用了强制转换,然后是它的工作日期

我的询问:

WITH cte AS (
    SELECT
        e.measurement_id,
        e.measurement_value,
        CAST(e.measurement_time AS DATE) AS sdt,
        ROW_NUMBER()
        OVER(PARTITION BY CAST(e.measurement_time AS DATE)
             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;
© www.soinside.com 2019 - 2024. All rights reserved.