[英]Reduce total number of SQL queries
我目前正在嘗試通過將2個查詢合並為一個來減少發送到RedShift集群的sql查詢總數。
這是我的情況。
這是我當前的,緩慢但正確的方法:
query1 = '''SELECT card_no, timestamp, code_one, transaction_amount
FROM table1
WHERE card_no BETWEEN %s AND %s
AND code_one = 202
AND code_two = 0
AND timestamp < date_trunc('day', CURRENT_DATE)
AND timestamp >= (CURRENT_DATE - INTERVAL '1 days')
ORDER BY card_no, timestamp DESC''' % (card_from, card_to)
query2 = '''SELECT * FROM table2 WHERE card_number = %s
ORDER BY transaction_date DESC LIMIT 1''' % card_no
此方法生成正確的輸出。
Query1首先運行,並根據不同范圍創建事務文件。
然后,我在這些文件中的每個card_no上運行query2,並執行一些邏輯運算以獲得最終輸出。
現在,我的數據集包含4000多個卡牌范圍,每個范圍返回30到100張交易卡。 查詢數量迅速增加,超出了我的控制范圍。
有沒有一種方法可以將這兩個查詢合並為一個,以大幅度減少查詢的總數?
感謝您的時間。
您只需要創建一個聯接並使用MAX()
聚合函數
SELECT
table1.card_no AS card_no,
table1.timestamp AS timestamp,
table1.code_one AS code_one,
table1.transaction_amount AS transaction_amount,
MAX(transaction_date) AS max_trans_date
FROM table1
LEFT JOIN table2
ON table1.card_no = table2.card_number
WHERE table1.card_no BETWEEN %s AND %s
AND table1.code_one = 202
AND code_two = 0
AND table1.timestamp < date_trunc('day', CURRENT_DATE)
AND table1.timestamp >= (CURRENT_DATE - INTERVAL '1 days')
GROUP BY card_no
ORDER BY card_no
對於max_trans_date
具有非空值的記錄將是在table2上進行過先前交易的卡。 如果您將“ LEFT JOIN”更改為“ INNER JOIN”,則只會獲得以前交易的卡。 如果在where子句AND max_trans_date IS NULL
中將LEFT JOIN與附加過濾器一起使用,則只會獲得沒有先前交易的卡。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.