我目前正试图通过将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张卡片之间返回交易。查询数量迅速增加,超出了我的控制范围
有没有办法可以将这两个查询合并为一个,以大幅减少查询总数?
感谢您的时间。
答案 0 :(得分: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
具有非空值的那些记录将是在table2上具有先前事务的卡。如果您将LEFT JOIN更改为INNER JOIN,您将只获得具有先前交易的那些卡。如果您在where AND max_trans_date IS NULL
中使用LEFT JOIN和附加过滤器,那么您将只获得没有先前交易的那些卡。