Om du inte har slno
i din tabell, då har du ingen tillförlitlig information vilken rad som infogades först. Det finns ingen naturlig ordning i en tabell, den fysiska ordningen på rader kan ändras när som helst (med valfri uppdatering eller med VACUUM
, etc.)
Du kunde använd en opålitlig trick:ordna efter den interna 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 avsaknad av annan information vilken rad kom först (vilket är ett designfel till att börja med, fixa det!), kan du försöka spara det du kan med den interna tupel-ID
ctid
Rader kommer att vara i fysisk ordning när de infogas från början, men det kan ändras när som helst med vilken skrivoperation som helst till tabellen eller
VACUUM
eller andra händelser.
Detta är ett mått på sista utväg och det kommer bryta. -
Din presenterade fråga var ogiltig på flera punkter:kolumnnamn saknas i 1:a CTE, saknas tabellnamn i 2:a CTE, ...
-
Du behöver ingen CTE för detta.
Enklare med DISTINCT ON
(överväganden för ctid
tillämpa samma):
SELECT DISTINCT ON (id)
id, status
FROM status
WHERE date >= '2015-06-01'
AND date < '2015-07-01'
ORDER BY id, date, ctid;