2014-10-30 139 views
0

我目前正試圖通過將2個查詢合併爲一個來減少發送到我的RedShift集羣的sql查詢的總數。
減少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張包含交易的卡片。查詢數量迅速增加,超出了我的控制範圍。
有沒有一種方法可以將這兩個查詢合併爲一個,以大大減少查詢的總數量?

謝謝你的時間。

+0

從'table1左連接table2 ON table1.card_no = table2.card_number'不知道爲什麼不能爲你做正確的事情?如果你這樣做,你可以在一個查詢中得到你所需要的。 – 2014-10-30 16:15:50

+0

你是否有這兩張桌子之間的關係..如果你有,你可以簡單地加入他們與左加入 – 2014-10-30 16:22:56

+0

這不幸的是不起作用。我只是想追加到查詢1的結果,查詢2的結果,但由於查詢2取決於查詢1,我似乎無法找到圍繞它的邏輯。 – Zihs 2014-10-30 16:30:05

回答

0

你只需要創建一個連接並使用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非空值這些記錄將是對錶2曾有過交易卡。如果您將LEFT JOIN更改爲INNER JOIN,則只會獲得具有以前事務處理的卡片。如果您在條款AND max_trans_date IS NULL的條款中使用了添加過濾器的LEFT JOIN,則只會獲得沒有先前交易的卡片。

+0

我喜歡這個主意,我認爲這個主題很接近,但是如果沒有group by子句中的select語句的其他成員,您的查詢就不會運行。此外,這將替換來自查詢1的記錄與來自查詢2的記錄,而不是追加它們。 – Zihs 2014-10-30 18:34:58

+0

@Zihs查詢將運行並假設表1中每個卡ID只有一條記錄,那麼聚合就不會有任何問題。如果表1中每個card_no有多個記錄,那麼您需要在其他table1列上指定聚合函數,否則您將得到不可預知的結果。我想我不知道你的意思是替換還是追加。這完全是一個SELECT,它根本不會改變任何數據。如果您使用實際的表架構信息和示例數據更新您的問題,以及您期望的最終輸出將會有所幫助。 – 2014-10-30 18:46:40