PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Filtraggio di record successivi duplicati in un SELECT

Bene, non sei così vicino perché row_number() non è possibile tenere traccia delle sequenze di due gruppi contemporaneamente. PARTITION BY tm_nl_fixedid ORDER BY date RESTART ON GAP non esiste, non esiste.

Itzik Ben-Gan ha una soluzione per il problema delle isole e delle lacune che stai affrontando (diverse soluzioni, in realtà). L'idea è di ordinare le righe in base ai criteri principali (data) e quindi ai criteri di partizione + criteri principali. La differenza tra gli ordinali rimarrà la stessa poiché appartengono agli stessi criteri di partizione e serie di date.

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

Ecco Sql Fiddle con un esempio .

Ed ecco il capitolo 5 di Sql Server MVP Deep Dives con diverse soluzioni al problema di isole e lacune .