Ini sedikit rumit. Alih-alih menggunakan rank()
atau sejenisnya, gunakan lag()
untuk melihat ketika sesuatu berubah. Kemudian lakukan penjumlahan kumulatif dari flag.
select dept, date1,
CASE WHEN StartFlag = 0 THEN 1
ELSE 1+StartFlag+NVL(lag(StartFlag) over (order by date1),0)
END as rnk
from (select t1.*,
(case when dept = lag(dept) over (order by date1)
then 1
else 0
end) as StartFlag
from t1
) t1
order by date1;
Ini SQLFiddlenya.
EDIT:
Ini adalah Gordon yang mengedit jawaban saya sendiri. Ups. Permintaan asli adalah 90% dari perjalanan ke sana. Ini mengidentifikasi grup di mana jumlahnya harus bertambah, tetapi tidak menetapkan nomor dalam kelompok. Saya akan melakukan ini dengan level lain row_number()
seperti di:
select dept, date1,
row_number() over (partition by dept, grp order by date1) as rnk
from (select dept, date1, startflag,
sum(StartFlag) over (partition by dept order by date1) as grp
from (select t1.*,
(case when dept = lag(dept) over (order by date1)
then 0
else 1
end) as StartFlag
from t1
) t1
) t1
order by date1;
Jadi, ide keseluruhannya adalah sebagai berikut. Pertama gunakan lag()
untuk menentukan di mana grup dimulai (yaitu, di mana ada perubahan departemen dari satu tanggal ke tanggal berikutnya). Kemudian, tetapkan "id grup" untuk ini, dengan melakukan penjumlahan kumulatif. Ini adalah catatan yang akan dihitung. Langkah terakhir adalah menghitungnya menggunakan row_number()
.