sql >> Base de Datos >  >> RDS >> Oracle

Total acumulado sobre grupo repetido por elementos según el tiempo en Oracle SQL

Para obtener las sumas que busca, necesita una forma de agrupar los valores que le interesan. Puede generar un ID de agrupación utilizando un par de ROW_NUMBER funciones analíticas, una dividida por el valor clave. Sin embargo, debido a su necesidad de duplicar la KEY valores de columna, esto deberá hacerse en un par de etapas:

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 consulta anterior crea una suma acumulada de AMT que se reinicia cada vez que cambia el valor de la clave. Mientras que la siguiente consulta utilizada en lugar de la última declaración de selección anterior da los resultados solicitados, que no llamaría una suma acumulada.

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

Para ver los valores de tiempo completo, es posible que desee modificar su sesión NLS_DATE_FORMAT como a continuación:

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

O envuelva cada columna de fecha en un TO_CHAR función con fines de salida.