PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Filtrage des enregistrements suivants en double dans un SELECT

Eh bien, vous n'êtes pas si proche parce que row_number() ne peut pas suivre les séquences de deux groupes en même temps. PARTITION BY tm_nl_fixedid ORDER BY date RESTART ON GAP n'existe pas, il n'y a rien de tel.

Itzik Ben-Gan a une solution pour le problème d'îlots et de lacunes auquel vous êtes confronté (plusieurs solutions, en fait). L'idée est d'ordonner les lignes par critère principal (date) puis par critère de partitionnement + critère principal. La différence entre les ordinaux restera la même car ils appartiennent aux mêmes critères de partitionnement et séries de dates.

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

Voici Sql Fiddle avec exemple .

Et voici le chapitre 5 de Sql Server MVP Deep Dives avec plusieurs solutions au problème des îles et des lacunes .