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.