Hvis du ikke har slno
i din tabel, så har du ikke nogen pålidelig information, hvilken række der blev indsat først. Der er ingen naturlig rækkefølge i en tabel, den fysiske rækkefølge af rækker kan ændres til enhver tid (med enhver opdatering eller med VACUUM
osv.)
Du kunne brug en upålidelig trick:sorter efter den 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;
-
I mangel af andre oplysninger, hvilken række kom først (hvilket er en designfejl til at begynde med, fix det!), kan du prøve at gemme, hvad du kan ved hjælp af den interne tupel-id
ctid
Rækker vil være i fysisk rækkefølge, når de indsættes i starten, men det kan ændres til enhver tid med enhver skriveoperation til tabellen eller
VACUUM
eller andre begivenheder.
Dette er en sidste udvej, og det vil pause. -
Din præsenterede forespørgsel var ugyldig på flere punkter:manglende kolonnenavn i 1. CTE, manglende tabelnavn i 2. CTE, ...
-
Du behøver ikke en CTE til dette.
Enklere med DISTINCT ON
(overvejelser for ctid
anvende det samme):
SELECT DISTINCT ON (id)
id, status
FROM status
WHERE date >= '2015-06-01'
AND date < '2015-07-01'
ORDER BY id, date, ctid;