sql >> Database >  >> RDS >> Oracle

Totaal over herhalende groep op items op basis van tijd in Oracle SQL

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.



  1. SQL Server-triggers - volgorde van uitvoering

  2. Een mysql-foutcode krijgen:1265. Gegevens afgekapt voor kolom bij het uitvoeren van een LOAD DATA LOCAL INFILE

  3. Correcte manier om gepoolde verbindingen levend te houden (of time-out en nieuwe te krijgen) tijdens langere inactiviteit voor MySQL, Grails 2-app

  4. pip install MySQL-python mislukt op ubuntu 14.04, fout:opdracht 'x86_64-linux-gnu-gcc' mislukt met afsluitstatus 1