Е, не сте толкова близо, защото row_number()
не може да проследява последователности от две групи едновременно. PARTITION BY tm_nl_fixedid ORDER BY date RESTART ON GAP
не съществува, няма такова нещо.
Ицик Бен-Ган има решение за проблема с островите и пропуските, с които се сблъсквате (всъщност няколко решения). Идеята е да се подредят редове по основните критерии (дата) и след това по критерии за разделяне + основни критерии. Разликата между ординалите ще остане същата, тъй като принадлежат към едни и същи критерии за разделяне и серии от дати.
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
А ето и глава 5 от Sql Server MVP Deep Dives с няколко решения на проблема с островите и празнините .