För att få de summor du letar efter behöver du ett sätt att gruppera de värden du är intresserad av. Du kan generera ett grupperings-ID genom att använda ett par ROW_NUMBER
analytiska funktioner, en partitionerad av nyckelvärdet. Men på grund av ditt behov av att duplicera KEY
kolumnvärden detta kommer att behöva göras i ett par steg:
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;
Ovanstående fråga skapar en löpande summa av AMT som startar om varje gång nyckelvärdet ändras. Medan följande fråga som används i stället för den senaste select-satsen ovan ger de begärda resultaten, som jag inte skulle kalla en löpande summa.
SELECT key2
, MIN(TIME) start_time
, MAX(TIME) stop_time
, sum(amt) amt
FROM t2
GROUP BY key2, gp;
För att se heltidsvärdena kanske du vill ändra din session NLS_DATE_FORMAT
enligt nedan:
ALTER SESSION SET NLS_DATE_FORMAT='DD-MM-RRRR HH24:MI:SS';
Eller slå in varje datumkolumn i en TO_CHAR
funktion för utdataändamål.