Хочу вывести средневзвешенную стоимость остатков клиента, за месяц которая приходится на 1 день.
Формирую временную табличку с датами за период:
WITH
DAYS# AS
(
SELECT
LSTDATE
FROM
(
SELECT
:pBegDate + LEVEL - 1 AS LSTDATE
FROM dual
START WITH :pBegDate <= :pEndDate
CONNECT BY :pBegDate + LEVEL - 1 <= :pEndDate
)
)
Дальше имеем табличку "CUSTOMER" с одним полем - ID
ID
---
101
и делаем CROSS JOIN таблиц.
Получаем на каждую дату вывод номера клиента.
Имеем таблиц остатков BAL. которая фиксирует только изменения остатка, там 3 поля:
ID - DATE - SUM
---------------------
101 - 30.11.2017 - 50
101 - 02.01.2018 - 300
101 - 05.01.2018 - 500
101 - 07.01.2018 - 700
Для примера выберем период: 01.01.2018 - 07.01.2018.
В итоге хочу получить в итоговой выборке:
101 - 01.01.2018 - 50 - сумма взята за 30.11.2017, т.к. это будет последний остаток на начало периода. Если его не было, то 0.
101 - 02.01.2018 - 300
101 - 03.01.2018 - 300 - сумма взята за 02.01
101 - 04.01.2018 - 300 - сумма взята за 02.01
101 - 05.01.2018 - 500
101 - 06.01.2018 - 500 - сумма взята за 05.01
101 - 07.01.2018 - 700
Когда я её подключаю через LEFT JOIN разумеется я не вижу суммы на дни в которые покупки не производились. LAG на отсутствующую запись никак не реагирует, да и не можем мы определить насколько "далекую" предыдущую запись надо смотреть.
Так что сейчас выходит так:
101 - 01.01.2018 -
101 - 02.01.2018 - 300
101 - 03.01.2018 -
101 - 04.01.2018 -
101 - 05.01.2018 - 500
101 - 06.01.2018 -
101 - 07.01.2018 - 700