За да получите сумите, които търсите, имате нужда от начин да групирате стойностите, които ви интересуват. Можете да генерирате групиращ идентификатор, като използвате няколко ROW_NUMBER
аналитични функции, едната разделена от ключовата стойност. Въпреки това поради необходимостта ви да дублирате KEY
стойности на колони, това ще трябва да се направи на няколко етапа:
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;
Горната заявка създава текуща сума от AMT, която се рестартира всеки път, когато стойността на ключа се промени. Като има предвид, че следната заявка, използвана на мястото на последния израз за избор по-горе, дава исканите резултати, които не бих нарекъл текуща сума.
SELECT key2
, MIN(TIME) start_time
, MAX(TIME) stop_time
, sum(amt) amt
FROM t2
GROUP BY key2, gp;
За да видите стойностите на пълното време, може да искате или да промените сесията си NLS_DATE_FORMAT
както по-долу:
ALTER SESSION SET NLS_DATE_FORMAT='DD-MM-RRRR HH24:MI:SS';
Или обвийте всяка колона с дата в TO_CHAR
функция за изходни цели.