sql >> Base de Datos >  >> RDS >> PostgreSQL

Filtrado de registros subsiguientes duplicados en un SELECCIONAR

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 .

Y aquí está el capítulo 5 de Sql Server MVP Deep Dives con varias soluciones al problema de islas y brechas .