Aby uzyskać sumy, których szukasz, potrzebujesz sposobu na pogrupowanie interesujących Cię wartości. Możesz wygenerować identyfikator grupowania, używając kilku ROW_NUMBER
funkcje analityczne, podzielone według wartości klucza. Jednak ze względu na potrzebę zduplikowania KEY
wartości kolumn należy to zrobić w kilku etapach:
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;
Powyższe zapytanie tworzy sumę bieżącą AMT, która jest uruchamiana ponownie za każdym razem, gdy zmienia się wartość klucza. Podczas gdy następujące zapytanie użyte w miejsce ostatniej instrukcji select powyżej daje żądane wyniki, których nie nazwałbym sumą bieżącą.
SELECT key2
, MIN(TIME) start_time
, MAX(TIME) stop_time
, sum(amt) amt
FROM t2
GROUP BY key2, gp;
Aby zobaczyć pełne wartości czasu, możesz zmienić swoją sesję NLS_DATE_FORMAT
jak poniżej:
ALTER SESSION SET NLS_DATE_FORMAT='DD-MM-RRRR HH24:MI:SS';
Lub zawiń każdą kolumnę daty w TO_CHAR
funkcja do celów wyjściowych.