Bene, non sei così vicino perché row_number()
non è possibile tenere traccia delle sequenze di due gruppi contemporaneamente. PARTITION BY tm_nl_fixedid ORDER BY date RESTART ON GAP
non esiste, non esiste.
Itzik Ben-Gan ha una soluzione per il problema delle isole e delle lacune che stai affrontando (diverse soluzioni, in realtà). L'idea è di ordinare le righe in base ai criteri principali (data) e quindi ai criteri di partizione + criteri principali. La differenza tra gli ordinali rimarrà la stessa poiché appartengono agli stessi criteri di partizione e serie di date.
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
Ecco Sql Fiddle con un esempio .