Bueno, no estás tan cerca porque row_number()
no puede rastrear secuencias por dos grupos al mismo tiempo. PARTITION BY tm_nl_fixedid ORDER BY date RESTART ON GAP
no existe, no hay tal cosa.
Itzik Ben-Gan tiene una solución para el problema de islas y brechas que enfrenta (varias soluciones, en realidad). La idea es ordenar las filas por el criterio principal (fecha) y luego por criterio de partición + criterio principal. La diferencia entre los ordinales seguirá siendo la misma ya que pertenecen al mismo criterio de partición y serie de fechas.
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
Aquí está Sql Fiddle con un ejemplo .