sql >> Databasteknik >  >> RDS >> Oracle

Körs totalt över upprepande grupp för objekt baserat på tid i Oracle SQL

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.



  1. Hur kan jag undvika hakparenteser i en LIKE-sats?

  2. Hur infogas multidimensionella arrayer i en MySQL-tabell?

  3. Kör 2 frågor tillsammans men kör separat

  4. Infoga en flerdimensionell php-array i en mysql-databas