Als je geen slno
. hebt in uw tabel, dan heeft u geen betrouwbare informatie welke rij als eerste is ingevoegd. Er is geen natuurlijke volgorde in een tabel, de fysieke volgorde van rijen kan op elk moment veranderen (met elke update, of met VACUUM
, enz.)
Je zou gebruik een onbetrouwbare truc:bestel op de interne 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;
-
Bij gebrek aan andere informatie welke rij eerst kwam (wat een ontwerpfout is) om te beginnen, repareer het!), zou je kunnen proberen op te slaan wat je kunt met behulp van de interne tuple-ID
ctid
Rijen staan in fysieke volgorde wanneer ze aanvankelijk worden ingevoegd, maar dat kan op elk moment veranderen met elke schrijfbewerking naar de tabel of
VACUUM
of andere gebeurtenissen.
Dit is een laatste redmiddel en het zal pauze. -
Uw gepresenteerde zoekopdracht was op verschillende punten ongeldig:kolomnaam ontbreekt in 1e CTE, ontbrekende tabelnaam in 2e CTE, ...
-
U hebt hiervoor geen CTE nodig.
Eenvoudiger met DISTINCT ON
(overwegingen voor ctid
hetzelfde toepassen):
SELECT DISTINCT ON (id)
id, status
FROM status
WHERE date >= '2015-06-01'
AND date < '2015-07-01'
ORDER BY id, date, ctid;