Untuk mendapatkan jumlah yang Anda cari, Anda memerlukan cara untuk mengelompokkan nilai yang Anda minati. Anda dapat membuat ID pengelompokan dengan menggunakan beberapa ROW_NUMBER
fungsi analitik, satu dipartisi oleh nilai kunci. Namun karena kebutuhan Anda untuk menduplikasi KEY
nilai kolom ini perlu dilakukan dalam beberapa tahap:
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;
Kueri di atas membuat jumlah AMT yang berjalan yang dimulai ulang setiap kali nilai kunci berubah. Sedangkan kueri berikut yang digunakan sebagai pengganti pernyataan pemilihan terakhir di atas memberikan hasil yang diminta, yang tidak akan saya sebut sebagai jumlah berjalan.
SELECT key2
, MIN(TIME) start_time
, MAX(TIME) stop_time
, sum(amt) amt
FROM t2
GROUP BY key2, gp;
Untuk melihat nilai waktu penuh, Anda mungkin ingin mengubah NLS_DATE_FORMAT
sesi Anda seperti di bawah ini:
ALTER SESSION SET NLS_DATE_FORMAT='DD-MM-RRRR HH24:MI:SS';
Atau bungkus setiap kolom tanggal dalam TO_CHAR
fungsi untuk tujuan keluaran.