Cóż, nie jesteś tak blisko, ponieważ row_number()
nie można jednocześnie śledzić sekwencji dwóch grup. PARTITION BY tm_nl_fixedid ORDER BY date RESTART ON GAP
nie istnieje, nie ma czegoś takiego.
Itzik Ben-Gan ma rozwiązanie problemu wysp i luk, z którymi się borykasz (właściwie kilka rozwiązań). Chodzi o to, aby uporządkować wiersze według kryteriów głównych (data), a następnie według kryteriów partycjonowania + kryteriów głównych. Różnica między liczbami porządkowymi pozostanie taka sama, ponieważ należą one do tych samych kryteriów podziału i serii dat.
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
A oto rozdział 5 głębokiego nurkowania Sql Server MVP z kilkoma rozwiązaniami problemu wysp i luk .