Om de sommen te krijgen die u zoekt, heeft u een manier nodig om de waarden waarin u geïnteresseerd bent te groeperen. U kunt een groeperings-ID genereren door een paar ROW_NUMBER
te gebruiken analytische functies, één gepartitioneerd door de sleutelwaarde. Vanwege uw behoefte om de KEY
. te dupliceren kolomwaarden dit moet in een aantal fasen worden gedaan:
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;
De bovenstaande query maakt een lopende som van AMT die opnieuw wordt gestart telkens wanneer de sleutelwaarde verandert. Terwijl de volgende query die wordt gebruikt in plaats van de laatste select-instructie hierboven de gevraagde resultaten geeft, die ik geen lopende som zou noemen.
SELECT key2
, MIN(TIME) start_time
, MAX(TIME) stop_time
, sum(amt) amt
FROM t2
GROUP BY key2, gp;
Om de fulltime waarden te zien, kun je ofwel je sessie wijzigen NLS_DATE_FORMAT
zoals hieronder:
ALTER SESSION SET NLS_DATE_FORMAT='DD-MM-RRRR HH24:MI:SS';
Of wikkel elke datumkolom in een TO_CHAR
functie voor uitvoerdoeleinden.