Nå, du er ikke så tæt på, fordi row_number()
kan ikke spore sekvenser af to grupper på samme tid. PARTITION BY tm_nl_fixedid ORDER BY date RESTART ON GAP
eksisterer ikke, der er ikke sådan noget.
Itzik Ben-Gan har en løsning på problemet med øer og huller, du står over for (faktisk flere løsninger). Ideen er at sortere rækker efter hovedkriterierne (dato) og derefter opdele kriterier + hovedkriterier. Forskellen mellem ordenstal forbliver den samme, da de hører til de samme opdelingskriterier og datoserier.
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
Her er Sql Fiddle med eksempel .
Og her er kapitel 5 af Sql Server MVP Deep Dives med flere løsninger på øer og huller-problem a> .