Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Executando o total sobre o grupo de repetição por itens com base no tempo no Oracle SQL


Para obter as somas que você está procurando, você precisa de uma maneira de agrupar os valores nos quais está interessado. Você pode gerar um ID de agrupamento usando alguns ROW_NUMBER funções analíticas, uma particionada pelo valor da chave. No entanto, devido à sua necessidade de duplicar a KEY valores de coluna, isso precisará ser feito em algumas 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;

A consulta acima cria uma soma em execução de AMT que é reiniciada sempre que o valor da chave é alterado. Considerando que a consulta a seguir usada no lugar da última instrução select acima fornece os resultados solicitados, que eu não chamaria de soma em execução.
SELECT key2
     , MIN(TIME) start_time
     , MAX(TIME) stop_time
     , sum(amt) amt
  FROM t2
 GROUP BY key2, gp;

Para ver os valores de tempo integral, você pode alterar sua sessão NLS_DATE_FORMAT como abaixo:
ALTER SESSION SET NLS_DATE_FORMAT='DD-MM-RRRR HH24:MI:SS';

Ou envolva cada coluna de data em um TO_CHAR função para fins de saída.