簡體   English   中英

自聯接以將兩個日期列與兩個日期的 groupby 計數列結合起來

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM