Tja, du är inte så nära eftersom row_number()
kan inte spåra sekvenser av två grupper samtidigt. PARTITION BY tm_nl_fixedid ORDER BY date RESTART ON GAP
inte finns, det finns inget sådant.
Itzik Ben-Gan har en lösning för problemet med öar och luckor du står inför (flera lösningar faktiskt). Tanken är att sortera rader efter huvudkriterierna (datum) och sedan efter partitioneringskriterier + huvudkriterier. Skillnaden mellan ordningstal kommer att förbli densamma eftersom de tillhör samma partitionskriterier och datumserier.
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
Här är Sql Fiddle med exempel .
Och här är kapitel 5 av Sql Server MVP Deep Dives med flera lösningar på problem med öar och luckor .