Para obter as somas que você está procurando, você precisa de uma maneira de agrupar os valores nos quais está interessado. Você pode gerar um ID de agrupamento usando alguns
ROW_NUMBER
funções analíticas, uma particionada pelo valor da chave. No entanto, devido à sua necessidade de duplicar a KEY
valores de coluna, isso precisará ser feito em algumas etapas:WITH t1 AS (
SELECT dta.*
, last_value(KEY IGNORE NULLS) -- Fill in the missing
OVER (ORDER BY TIME ASC) key2 -- key values
FROM your_data dta
), t2 AS (
SELECT t1.*
, row_number() OVER (ORDER BY TIME) -- Generate a
- row_number() OVER (PARTITION BY key2 -- grouping ID
ORDER BY TIME) gp
FROM t1
)
SELECT t2.*
, sum(amt) OVER (PARTITION BY gp, key2
ORDER BY TIME) running_sums
FROM t2;
A consulta acima cria uma soma em execução de AMT que é reiniciada sempre que o valor da chave é alterado. Considerando que a consulta a seguir usada no lugar da última instrução select acima fornece os resultados solicitados, que eu não chamaria de soma em execução.
SELECT key2
, MIN(TIME) start_time
, MAX(TIME) stop_time
, sum(amt) amt
FROM t2
GROUP BY key2, gp;
Para ver os valores de tempo integral, você pode alterar sua sessão
NLS_DATE_FORMAT
como abaixo:ALTER SESSION SET NLS_DATE_FORMAT='DD-MM-RRRR HH24:MI:SS';
Ou envolva cada coluna de data em um
TO_CHAR
função para fins de saída.