У меня есть таблица с именем transactions
, которая содержит продавцов и их транзакции: продажи, отходы и всякий раз, когда они получают продукты.Структура по сути следующая:
seller_id transaction_date quantity reason product unit_price
--------- ---------------- -------- ------ ------- ----------
1 2018-01-01 10 import 1 100.0
1 2018-01-01 -5 sale 1 100.0
1 2018-01-01 -1 waste 1 100.0
2 2018-01-01 -3 sale 4 95.5
Мне нужна ежедневная сводка по каждому продавцу, включая стоимость его продаж, количество отходов и начальный запас.Проблема в том, что начальный запас представляет собой совокупную сумму количеств до указанного дня (импорт в указанный день также включен).У меня есть следующий запрос:
SELECT
t.seller_id,
t.transaction_date,
t.SUM(quantity * unit_price) as amount,
t.reason as reason,
(
SELECT SUM(unit_price * quantity) FROM transactions
WHERE seller_id = t.seller_id
AND (transaction_date <= t.transaction_date)
AND (
transaction_date < t.transaction_date
OR reason = 'import'
)
) as opening_balance
FROM transactions t
GROUP BY
t.transaction_date,
t.seller_id
t.reason
Запрос работает, и я получаю желаемые результаты.Однако даже после создания индексов как для внешнего, так и для подзапроса это занимает слишком много времени (около 30 секунд), поскольку запрос opening_balance
является зависимым подзапросом, который вычисляется для каждой строки снова и снова.
Как я могу оптимизировать или переписать этот запрос?
Редактировать: В подзапросе была небольшая ошибка с отсутствующим условием WHERE, я исправил ее, но суть вопроса та же.Я создал скрипку с примерами данных для игры:
https://www.db -fiddle.com / f / ma7MhufseHxEXLfxhCtGbZ / 2