Я хотел бы спросить предложения о более эффективных способах эффективного выполнения запросов. Допустим, у меня есть таблица с именами payment_info и customer_master.
payment_info
table:
created_date
(отметка времени) | customer_id
| category
| payment_amount
| carryover_amount
customer_master
таблица:
customer_id
| carryover_amount
Из этих таблиц мне нужно запросить данные за определенный месяц и год (интересующий месяц) следующим образом:
(1). Если существует запись до интересующего месяца, найдите carryover_amount
последней записи из payment_info
таблицы
(2). Если (1) не выполняется, найдите первую запись интересующего месяца и вычислите carryover_amount
на основе категории из таблицы payment_info
.
(3). Если (1) и (2) не удовлетворены, найдите carryover_amount
из таблицы customer_master
Скажем: интересующий месяц 202007
(июль 2020 г.).
Запрос на выборку, который я мог придумать прямо сейчас, выглядит следующим образом:
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_info. Однако, когда объем данных достаточно велик, этот запрос выполняется бесконечно. Я знаю, что указанный выше запрос неэффективен, но я не мог найти лучшего способа решить указанную выше проблему. Именно об этом я и хочу спросить в этом посте. Есть ли способ сделать более быстрый запрос относительно вышеуказанной проблемы. Любое предложение приветствуется.
Спасибо.
Примечание: я использую Postgres, и мне не разрешено изменять структуру таблицы .