[英]Self join to combine two date columns with groupby count columns for both dates
我有請求日期和取件日期列。 它們相似但不相同。 我目前正在使用兩個單獨的查詢和 pandas 來連接 2 個數據幀。 我正在使用 SQLAlchemy 在 Flask 中運行它,因此 WHERE 中的所有內容都將傳遞變量。 一旦我在 DB Browser 中測試過它,我就使用 text() 方法來運行原始 SQL 。 我搞砸了,但沒有取得任何進展,試圖單獨使用 sql 獲得我想要的 output。
SELECT r.PUDate, COUNT(r.PUDate) as trips
FROM requests r
WHERE PULoc IN ("list of location ID's")
AND r.'TO' IN ("list of requestors")
AND ReqDate >= '2014-01-01'
AND ReqDate <= '2019-12-31'
AND PUDate >= '2014-01-01'
AND PUDate <= '2019-12-31'
GROUP BY PUDate
ORDER BY PUDate;
SELECT r.ReqDate, COUNT(r.ReqDate) as reqs
FROM requests r
WHERE PULoc IN ("list of location ID's")
AND r.'TO' IN ("list of requestors")
AND ReqDate >= '2014-01-01'
AND ReqDate <= '2019-12-31'
AND PUDate >= '2014-01-01'
AND PUDate <= '2019-12-31'
GROUP BY PUDate
ORDER BY PUDate;
我在 pandas 中實現的所需 output 是一個日期列,其中包含來自 2 個日期列的日期的唯一列表。 然后請求計數和拾取計數列,用零代替空值,因為某些日期對於一列或另一列是唯一的。 是自我加入 go 的方式還是有更好的方法?
一種選擇是union all
:
select xDate, sum(trips) trips, sum(reqs) reqs
from (
select PULoc, to, r.PUDate xDate, 1 trips, 0 reqs from requests r
union all
select PULoc, to, r.ReqDate, 0, 1 from requests r
) t
where
PULoc in ("list of location ID's")
and to in ("list of requestors")
and xDate >= '2014-01-01'
and xDate < '2015-01-01'
group by xDate
order by xDate;
我將過濾條件移到了外部查詢中,這樣查詢更容易編寫。 我希望數據庫應該能夠將謂詞下推到子查詢 - 但是,如果您看到性能問題,您可以在子查詢中重復過濾條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.