我正在嘗試使用 SQL 將資料從資料庫中提取到 Jupyter (python) 筆記本中并在那里使用它。我有一個查詢,可以提取航班上傳日期的 yearweek,并計算該 yearweek 中的航班數量。最后,它按上傳日期的年周對結果進行分組:
SELECT YEARWEEK(d.upload_date), COUNT(f.id)
FROM apps_flight f
LEFT JOIN apps_enginedatafile d ON d.id=f.import_file_id
WHERE f.global_duplicate = 0
GROUP BY YEARWEEK(d.upload_date)
我想計算每個 yearweek 的訂閱者數量(位于另一個表中),以將它們與航班數進行比較。所以我試圖通過添加以下內容來加入所述表:
LEFT JOIN apps_subscription s ON s.basesubscription_ptr_id = f.id
但是,當我這樣做時,我的航班值的計數會發生變化!原始查詢的前幾個計數如下所示:
[327, 605, 78, 5768, 9716, 9686, 7902, 3699, 3323, 6081, 4966, 3456, 3181, 2749, 4577, 3157, ... 17923
加入表后,變成:
[327, 738, 78, 8854, 17418, 16156, 13921, 7536, 5380, 10040, 7559, 5461, 6323, 6412, 6702, 59233, ...] 2
我不確定這里發生了什么。也許連接正在創建重復的行?資料集非常大,運行查詢大約需要 30 分鐘。添加 LIMIT 似乎并沒有加快速度,因此您可以想象,測驗需要一點時間。(如果我不知道除了 LIMIT 之外的另一種加速查詢的方法,請隨時讓我知道)!
感謝您提供任何資訊。
uj5u.com熱心網友回復:
只需加入兩個聚合計數查詢。下面假設相同的結構,包括列名。(調整upload_date到 中的實際日期/時間列apps_subscription。)
WITH agg_flights AS (
SELECT YEARWEEK(d.upload_date) AS year_week,
COUNT(f.id) AS flight_counts
FROM apps_flight f
LEFT JOIN apps_enginedatafile d
ON d.id = f.import_file_id
WHERE f.global_duplicate = 0
GROUP BY YEARWEEK(d.upload_date)
), agg_subs AS (
SELECT YEARWEEK(s.upload_date) AS year_week, -- ADJUST date/time variable
COUNT(f.id) AS subscriber_counts
FROM apps_flight f
LEFT JOIN apps_subscription s
ON s.basesubscription_ptr_id = f.id
WHERE f.global_duplicate = 0
GROUP BY YEARWEEK(s.upload_date) -- ADJUST date/time variable
)
SELECT f.year_week,
f.flight_counts,
s.subscriber_counts
FROM agg_flights f
INNER JOIN agg_subs s
ON f.year_week = s.year_week
uj5u.com熱心網友回復:
聯接創建所有聯接的表的組合行。因此,如果該航班具有多個 import_file_id 值,則 f 和 d 之間的連接將具有多行(在 group by 之前),如果航班具有多個訂閱,則 s 上的連接將添加多行。并且 COUNT 對連接的結果進行操作,而不是對連接前的 f 表進行操作。
在這種情況下,簡單的解決方法是使用COUNT(DISTINCT f.id)代替COUNT(f.id),因此每個航班每年每周只計算一次。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387407.html
