Nou, je bent niet zo dichtbij omdat row_number()
kan geen sequenties van twee groepen tegelijk volgen. PARTITION BY tm_nl_fixedid ORDER BY date RESTART ON GAP
bestaat niet, zoiets bestaat niet.
Itzik Ben-Gan heeft een oplossing voor het probleem met eilanden en gaten waarmee u wordt geconfronteerd (meerdere oplossingen eigenlijk). Het idee is om rijen te ordenen op basis van de belangrijkste criteria (datum) en vervolgens op indelingscriteria + hoofdcriteria. Het verschil tussen de rangtelwoorden blijft hetzelfde omdat ze tot dezelfde indelingscriteria en datumreeksen behoren.
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
Hier is Sql Fiddle met voorbeeld .