PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Herausfiltern doppelter nachfolgender Datensätze in einem SELECT

Nun, Sie sind nicht so nah dran, weil row_number() kann keine Sequenzen von zwei Gruppen gleichzeitig verfolgen. PARTITION BY tm_nl_fixedid ORDER BY date RESTART ON GAP existiert nicht, so etwas gibt es nicht.

Itzik Ben-Gan hat eine Lösung für das Problem der Inseln und Lücken, mit dem Sie konfrontiert sind (eigentlich mehrere Lösungen). Die Idee ist, Zeilen nach den Hauptkriterien (Datum) und dann nach Partitionierungskriterien + Hauptkriterien zu ordnen. Der Unterschied zwischen Ordnungszahlen bleibt gleich, da sie zu denselben Partitionierungskriterien und Datumsreihen gehören.

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

Hier ist Sql Fiddle mit Beispiel .

Und hier ist Kapitel 5 von Sql Server MVP Deep Dives mit mehreren Lösungen für das Insel- und Lückenproblem .