Oracle
 sql >> Database >  >> RDS >> Oracle

Totale parziale su elementi ripetuti raggruppati in base al tempo in Oracle SQL

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.