Se non hai slno
nella tua tabella, quindi non hai alcuna informazione affidabile quale riga è stata inserita per prima. Non esiste un ordine naturale in una tabella, l'ordine fisico delle righe può cambiare in qualsiasi momento (con qualsiasi aggiornamento o con VACUUM
, ecc.)
Potresti usa un inaffidabile trucco:ordina in base al ctid
interno .
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 assenza di altre informazioni, quale riga è arrivata prima (che è un errore di progettazione per cominciare, correggilo!), potresti provare a salvare ciò che puoi utilizzando il ID tupla
ctid
Le righe saranno in ordine fisico quando inserite inizialmente, ma ciò può cambiare in qualsiasi momento con qualsiasi operazione di scrittura sulla tabella o
VACUUM
o altri eventi.
Questa è una misura di ultima risorsa e lo farà pausa. -
La query presentata non era valida per diversi motivi:nome della colonna mancante nel 1° CTE, nome della tabella mancante nel 2° CTE, ...
-
Non hai bisogno di un CTE per questo.
Più semplice con DISTINCT ON
(considerazioni per ctid
applicare lo stesso):
SELECT DISTINCT ON (id)
id, status
FROM status
WHERE date >= '2015-06-01'
AND date < '2015-07-01'
ORDER BY id, date, ctid;