Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Laufende Summe über sich wiederholende Gruppierung nach Elementen basierend auf Zeit in Oracle SQL

Um die gesuchten Summen zu erhalten, müssen Sie die Werte gruppieren, an denen Sie interessiert sind. Sie können eine Gruppierungs-ID generieren, indem Sie ein paar ROW_NUMBER verwenden Analysefunktionen, eine nach dem Schlüsselwert partitioniert. Allerdings müssen Sie den KEY duplizieren Spaltenwerte muss dies in mehreren Schritten erfolgen:

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;

Die obige Abfrage erstellt eine laufende Summe von AMT, die jedes Mal neu gestartet wird, wenn sich der Schlüsselwert ändert. Wohingegen die folgende Abfrage, die anstelle der letzten select-Anweisung oben verwendet wird, die angeforderten Ergebnisse liefert, die ich nicht als laufende Summe bezeichnen würde.

SELECT key2
     , MIN(TIME) start_time
     , MAX(TIME) stop_time
     , sum(amt) amt
  FROM t2
 GROUP BY key2, gp;

Um die Gesamtzeitwerte anzuzeigen, können Sie entweder Ihre Sitzung NLS_DATE_FORMAT ändern wie unten:

ALTER SESSION SET NLS_DATE_FORMAT='DD-MM-RRRR HH24:MI:SS';

Oder umschließen Sie jede Datumsspalte mit einem TO_CHAR Funktion für Ausgabezwecke.