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.