Executando total sobre o grupo de repetição por itens com base no tempo no Oracle SQL
Meu primeiro post, então tenha paciência comigo. Eu quero somar com base em um valor que é dividido por datas, mas quero apenas a soma para as datas, não para o grupo por item no total. Estão trabalhando nisso há dias, tentando evitar o uso de um cursor, mas talvez seja necessário.
Aqui está um exemplo dos dados que estou vendo. BTW, isso está no 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
O resultado final deve ficar assim:
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
Consegui obter a Chave para preencher os Nulos. A chave nem sempre é inserida, mas assume-se o valor até que seja realmente alterada.
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;
Mas quando tento obter apenas um total, ele soma a chave mesmo com os intervalos. Não consigo descobrir como fazê-lo funcionar com a chave. Aqui está minha melhor chance, que não é muito boa e não funciona corretamente.
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;
Qualquer ajuda seria apreciada. Talvez usando o cursor seja o único caminho.
Corresponder dados de amostra.