sql >> Database teknologi >  >> RDS >> Oracle

Kørsel i alt over gentagne grupper efter elementer baseret på tid i Oracle SQL

For at få de beløb, du leder efter, har du brug for en måde at gruppere de værdier, du er interesseret i. Du kan generere et grupperings-id ved at bruge et par ROW_NUMBER analytiske funktioner, en opdelt efter nøgleværdien. Men på grund af dit behov for at duplikere KEY kolonneværdier dette skal gøres i et par trin:

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;

Ovenstående forespørgsel opretter en løbende sum af AMT, der genstarter hver gang nøgleværdien ændres. Hvorimod følgende forespørgsel brugt i stedet for den sidste select-erklæring ovenfor giver de ønskede resultater, som jeg ikke vil betegne som en løbende sum.

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

For at se fuldtidsværdierne kan du enten ændre din session NLS_DATE_FORMAT som nedenfor:

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

Eller pak hver datokolonne ind i en TO_CHAR funktion til outputformål.



  1. Hvorfor giver åbning af en forbindelse en distribueret transaktionsfejl i MySQL? (.NET-stik)

  2. SQL-forespørgsel for at få tal af ord i tabel

  3. Variabel 'sql_mode' kan ikke indstilles til værdien 'NO_AUTO_CREATE_USER'

  4. Hent pl/sql-array-returværdier i java