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;