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

Deterministische Sortierreihenfolge für Fensterfunktionen

Wenn Sie slno nicht haben in Ihrer Tabelle, dann haben Sie keine zuverlässige Information, welche Zeile zuerst eingefügt wurde. Es gibt keine natürliche Reihenfolge in einer Tabelle, die physische Reihenfolge der Zeilen kann sich jederzeit ändern (mit jeder Aktualisierung oder mit VACUUM usw.)

Sie könnten Verwenden Sie ein unzuverlässiges Trick:Sortieren nach interner ctid .

select *
from  (
   select id, status
        , row_number() OVER (PARTITION BY id
                             ORDER BY date, ctid) AS row_num
   from   status  -- that's your table name??
   where  date >= '2015-06-01'  -- assuming column is actually a date
   and    date <  '2015-07-01'
  ) sub
where  row_num = 1;
  • In Ermangelung anderer Informationen, welche Zeile zuerst kam (was ein Designfehler ist). Reparieren Sie es zuerst!), könnten Sie versuchen, so viel wie möglich zu retten, indem Sie den internen Tupel-ID ctid

    Zeilen werden beim ersten Einfügen in physischer Reihenfolge sein, aber das kann sich jederzeit mit jedem Schreibvorgang in die Tabelle oder VACUUM ändern oder andere Ereignisse.
    Dies ist ein letzter Ausweg und wird Pause.

  • Ihre präsentierte Abfrage war in mehrfacher Hinsicht ungültig:fehlender Spaltenname im 1. CTE, fehlender Tabellenname im 2. CTE, ...

  • Dafür brauchen Sie keinen CTE.

Einfacher mit DISTINCT ON (Überlegungen zu ctid gilt dasselbe):

SELECT DISTINCT ON (id)
       id, status
FROM   status
WHERE  date >= '2015-06-01'
AND    date <  '2015-07-01'
ORDER  BY id, date, ctid;