PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Filtrando registros subsequentes duplicados em um SELECT


Bem, você não está tão perto porque row_number() não pode rastrear sequências de dois grupos ao mesmo tempo. PARTITION BY tm_nl_fixedid ORDER BY date RESTART ON GAP não existe, não existe tal coisa.

Itzik Ben-Gan tem uma solução para o problema de ilhas e lacunas que você está enfrentando (várias soluções, na verdade). A ideia é ordenar as linhas pelo critério principal (data) e depois por critério de particionamento + critério principal. A diferença entre ordinais permanecerá a mesma, pois pertencem aos mesmos critérios de particionamento e séries de datas.
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

Aqui está Sql Fiddle com exemplo .

E aqui está o capítulo 5 do Sql Server MVP Deep Dives com várias soluções para o problema de ilhas e lacunas a> .