Oracle
 sql >> Base de données >  >> RDS >> Oracle

Total cumulé sur les éléments répétés du groupe par en fonction du temps dans Oracle SQL

Afin d'obtenir les sommes que vous recherchez, vous avez besoin d'un moyen de regrouper les valeurs qui vous intéressent. Vous pouvez générer un ID de regroupement en utilisant quelques ROW_NUMBER fonctions analytiques, une partitionnée par la valeur clé. Cependant, en raison de votre besoin de dupliquer la KEY valeurs de colonne, cela devra être fait en quelques étapes :

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 requête ci-dessus crée une somme cumulée d'AMT qui redémarre chaque fois que la valeur de la clé change. Alors que la requête suivante utilisée à la place de la dernière instruction de sélection ci-dessus donne les résultats demandés, que je n'appellerais pas une somme courante.

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

Pour voir les valeurs de temps plein, vous pouvez soit modifier votre session NLS_DATE_FORMAT comme ci-dessous :

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

Ou enveloppez chaque colonne de date dans un TO_CHAR fonction à des fins de sortie.