我想问关于更好的方法做查询效率的建议。假设我有一个名为payment\u info和customer\u master的表。 payment_info
表格: created_date
(时间戳) customer_id
| category
| payment_amount
|
carryover_amount customer_master
表格: customer_id
| carryover_amount
从这些表中,我需要根据特定的月份和年份(感兴趣的月份)查询数据,如下所示:
(1). 如果在感兴趣的月份之前存在记录,则查找 carryover_amount
最后一条记录 payment_info
table
(2). 如果(1)不满足,则查找感兴趣月份的第一条记录,并计算 carryover_amount
基于 payment_info
table。
(3). 如果(1)和(2)不满意,则查找 carryover_amount
从 customer_master
table
假设:感兴趣的月份是 202007
(2020年7月)。
我现在可以想到的select查询如下:
SELECT (CASE
WHEN EXISTS (SELECT * FROM payment_info WHERE customer_id = a.customer_id AND to_char(created_date, 'YYYYMM') < '202007')
THEN ( SELECT carryover_amount FROM payment_info WHERE customer_id = a.customer_id ORDER BY created_date DESC )
WHEN EXISTS (SELECT * FROM payment_info WHERE customer_id = a.customer_id AND to_char(created_date, 'YYYYMM') = '202007')
THEN ( SELECT (CASE
WHEN category = 1 THEN carryover_amount - payment_amount
ELSE carryover_amount + payment_amount
END)
FROM payment_info WHERE customer_id = a.customer_id AND to_char(created_date, 'YYYYMM') = '202007'
)
ELSE (SELECT carryover_amount FROM customer_master WHERE customer_id = a.customer_id)
END) AS carryover
FROM payment_info a
此查询适用于payment\u info表中的少量数据。但是,当数据足够大时,此查询将永远使用。我知道上面的查询效率不高,但是我找不到更好的方法来解决上面的问题。这就是我在这篇文章里想问的。有没有办法做一个更快的查询关于上述问题的任何建议是赞赏的。
谢谢。
注意:我使用的是postgres,不允许更改表结构。
2条答案
按热度按时间b5lpy0ml1#
我会先尝试横向连接:
e0uiprwp2#
当我们专门为大数据集构建查询时,在select语句中使用select语句是不好的做法。请尽量避免。
我假设创建日期也有时间。你可以根据你的要求改变。下面是我将如何做到这一点的 backbone 。我希望这就是你想要的: