sql >> Databáze >  >> RDS >> Oracle

Průběžný součet přes opakující se skupiny podle položek na základě času v Oracle SQL

Abyste získali částky, které hledáte, potřebujete způsob, jak seskupit hodnoty, které vás zajímají. ID seskupení můžete vygenerovat pomocí páru ROW_NUMBER analytické funkce, jedna rozdělená hodnotou klíče. Nicméně kvůli vaší potřebě duplikovat KEY hodnoty sloupců to bude nutné provést v několika fázích:

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;

Výše uvedený dotaz vytvoří průběžný součet AMT, který se restartuje pokaždé, když se změní hodnota klíče. Zatímco následující dotaz použitý namísto posledního příkazu select výše poskytuje požadované výsledky, které bych nenazval průběžným součtem.

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

Chcete-li zobrazit hodnoty na plný úvazek, možná budete chtít upravit svou relaci NLS_DATE_FORMAT jak je uvedeno níže:

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

Nebo zabalte každý sloupec data do TO_CHAR funkce pro výstupní účely.



  1. SQL dotaz k nalezení řádků s alespoň jednou ze zadaných hodnot

  2. Zpět k příkazovému řádku sqlplus

  3. Java PreparedStatement načítá poslední vložené ID

  4. Jak zkontrolovat velikost všech tabulek v databázi v MySQL