我目前正在学习在 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;
我刚刚删除了 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;