减少SQL查询的总数

时间:2014-10-30 16:11:01

标签: mysql sql

我目前正试图通过将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张卡片之间返回交易。查询数量迅速增加,超出了我的控制范围 有没有办法可以将这两个查询合并为一个,以大幅减少查询总数?

感谢您的时间。

1 个答案:

答案 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和附加过滤器,那么您将只获得没有先前交易的那些卡。