Per ottenere le somme che stai cercando hai bisogno di un modo per raggruppare i valori che ti interessano. Puoi generare un ID di raggruppamento utilizzando un paio di ROW_NUMBER
funzioni analitiche, una partizionata dal valore della chiave. Tuttavia, a causa della tua necessità di duplicare la KEY
valori di colonna questo dovrà essere fatto in un paio di fasi:
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;
La query precedente crea una somma parziale di AMT che si riavvia ogni volta che il valore della chiave cambia. Considerando che la seguente query utilizzata al posto dell'ultima istruzione select sopra fornisce i risultati richiesti, che non definirei una somma parziale.
SELECT key2
, MIN(TIME) start_time
, MAX(TIME) stop_time
, sum(amt) amt
FROM t2
GROUP BY key2, gp;
Per vedere i valori a tempo pieno potresti voler modificare la tua sessione NLS_DATE_FORMAT
come di seguito:
ALTER SESSION SET NLS_DATE_FORMAT='DD-MM-RRRR HH24:MI:SS';
Oppure racchiude ogni colonna di data in un TO_CHAR
funzione per scopi di output.