簡體   English   中英

減少SQL查詢總數

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

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