根據任務 5(撰寫查詢)的這個 Kaggle 練習: https ://www.kaggle.com/code/setthawutkulsrisuwan/exercise-as-with 我回答了 2 種方式:
- 使用 WHERE EXTRACT() 查詢以獲取年份和月份,答案是 INCORRECT。:
WITH RelevantRides AS
(
SELECT EXTRACT(HOUR from trip_start_timestamp) as hour_of_day, trip_seconds, trip_miles
FROM `bigquery-public-data.chicago_taxi_trips.taxi_trips`
WHERE EXTRACT(YEAR from trip_start_timestamp) = 2017 AND
EXTRACT(MONTH from trip_start_timestamp) BETWEEN 1 and 6 AND
trip_seconds > 0 AND
trip_miles > 0
)
SELECT hour_of_day,
COUNT(1) as num_trips,
3600 * SUM(trip_miles) / SUM(trip_seconds) as avg_mph
FROM RelevantRides
GROUP BY hour_of_day
ORDER BY hour_of_day
- 使用直接列名查詢得到年份和月份,答案是正確的。:
WITH RelevantRides AS
(
SELECT EXTRACT(HOUR from trip_start_timestamp) AS hour_of_day, trip_seconds, trip_miles
FROM `bigquery-public-data.chicago_taxi_trips.taxi_trips`
WHERE trip_start_timestamp > '2017-01-01' AND
trip_start_timestamp < '2017-07-01' AND
trip_seconds > 0 AND
trip_miles > 0
)
SELECT hour_of_day,
COUNT(1) as num_trips,
3600 * SUM(trip_miles) / SUM(trip_seconds) as avg_mph
FROM RelevantRides
GROUP BY hour_of_day
ORDER BY hour_of_day
主要區別在于第一個是
WHERE EXTRACT(YEAR from trip_start_timestamp) = 2017
AND EXTRACT(MONTH from trip_start_timestamp) BETWEEN 1 and 6
,第二個是
WHERE trip_start_timestamp > '2017-01-01' AND
trip_start_timestamp < '2017-07-01'
.
在我看來,它們的結果應該與使用 EXTRACT() 查詢顯示 2017 年和 1 到 6 月份的結果與使用直接列名查詢相同;但是,結果并不相同。
請解釋這些背后的原因。謝謝你。
uj5u.com熱心網友回復:
您正在將恒定日期與時間戳進行比較。常量日期實際上是看起來像的時間戳2022-04-07 00:00:00。
因此,當您想要獲取 1 月至 6 月日期范圍內的所有記錄時,您需要:
WHERE trip_start_timestamp >= '2017-01-01'
AND trip_start_timestamp < '2017-07-01'
換句話說,您想要范圍的第一天午夜或之后的所有內容,以及最后一天后第二天午夜之前的所有內容,但不包括午夜。在數學符號中,您希望日期在 [2017-01-01, 2017-07-01) 范圍內。范圍的起點是封閉的,終點是開放的。
你這樣的代碼給出了正確的結果。
WHERE EXTRACT(YEAR from trip_start_timestamp) = 2017
AND EXTRACT(MONTH from trip_start_timestamp) BETWEEN 1 and 6
但它不能利用trip_start_timestamp列上的索引,因此在生產中效率不高。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/459859.html
標籤:mysql sql 约会时间 mysql-python 卡格尔
