Yah, Anda tidak sedekat itu karena row_number()
tidak dapat melacak urutan oleh dua kelompok pada waktu yang sama. PARTITION BY tm_nl_fixedid ORDER BY date RESTART ON GAP
tidak ada, tidak ada yang seperti itu.
Itzik Ben-Gan memiliki solusi untuk masalah pulau dan kesenjangan yang Anda hadapi (sebenarnya beberapa solusi). Idenya adalah untuk mengurutkan baris berdasarkan kriteria utama (tanggal) dan kemudian dengan membagi kriteria + kriteria utama. Perbedaan antara ordinal akan tetap sama karena mereka termasuk dalam kriteria partisi dan deret tanggal yang sama.
with cte as
(
select *,
-- While order by date and order by something-else, date
-- run along, they belong to the same sequence
row_number() over (order by tm_date)
- row_number() over (order by tm_nl_fixedid, tm_date) grp
from trackingMessages
)
select *,
-- Now we can get ordinal number grouped by each sequence
row_number() over (partition by tm_nl_fixedid, grp
order by tm_date) rn
from cte
order by tm_date
Ini Sql Fiddle beserta contohnya .