Мой первый пост, так что несите меня. Я хочу суммировать на основе значения, которое разбивается по датам, но требуется только сумма для дат, а не для общей группы по предмету. Работали над этим в течение нескольких дней, пытаясь избежать использования курсора, но, возможно, придется.Выполнение всего по повторяющейся группе по элементам по времени в Oracle SQL
Вот пример данных, на которые я смотрю. Кстати, это в Oracle 11g.
Key Time Amt
------ ------------------ ------
Null 1-1-2016 00:00 50
Null 1-1-2016 02:00 50
Key1 1-1-2016 04:00 30
Null 1-1-2016 06:00 30
Null 1-1-2016 08:00 30
Key2 1-1-2016 10:00 40
Null 1-1-2016 12:00 40
Key1 1-1-2016 14:00 30
Null 1-2-2016 00:00 30
Key2 1-2-2016 02:00 35
Конечный результат должен выглядеть следующим образом:
Key Start Stop Amt
------ ---------------- ---------------- -----
Null 1-1-2016 00:00 1-1-2016 02:00 100
Key1 1-1-2016 04:00 1-1-2016 08:00 90
Key2 1-1-2016 10:00 1-1-2016 12:00 80
Key1 1-1-2016 14:00 1-2-2016 00:00 60
key2 1-2-2016 02:00 1-2-2016 02:00 35
Я был в состоянии получить ключ, чтобы заполнить в Nulls. Ключ не всегда вводится, но считается значением до фактического изменения.
SELECT key ,time ,amt
FROM (
SELECT DISTINCT amt, time,
,last_value(amt ignore nulls) OVER (
ORDER BY time
) key
FROM sample
ORDER BY time, amt
)
WHERE amt > 0
ORDER BY time, key NULLS first;
Но когда я пытаюсь получить только текущую сумму, она суммируется на ключе даже с перерывами. Я не могу понять, как заставить его сломать ключ. Вот мой лучший снимок, который не очень хорош и не работает правильно.
SELECT key,time, amt
, sum(amt) OVER (PARTITION BY key ORDER BY time) AS running_total
FROM (SELECT key, time, amt
FROM (SELECT DISTINCT
amt,
time,
last_value(amt ignore nulls) OVER (ORDER BY time) key
FROM sample
ORDER BY time, amt
)
WHERE amt > 0
ORDER BY time, key NULLS first
)
ORDER BY time, key NULLS first;
Любая помощь будет принята с благодарностью. Возможно, использование курсора - единственный способ.
Данные образца образца.
Почему Key 1 есть время остановки в 8:00? – xQbert