Jeśli nie masz slno
w Twojej tabeli, to nie masz żadnych wiarygodnych informacji, który wiersz został wstawiony jako pierwszy. Nie ma naturalnej kolejności w tabeli, fizyczna kolejność wierszy może się zmienić w dowolnym momencie (z dowolną aktualizacją lub za pomocą VACUUM
itp.)
możesz użyj niewiarygodnego sztuczka:kolejność według wewnętrznego 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;
-
W przypadku braku innych informacji, który wiersz pojawił się jako pierwszy (co jest błędem projektowym) na początek napraw to!), możesz spróbować zapisać to, co możesz, korzystając z wewnętrznego Identyfikator krotki
ctid
Po początkowym wstawieniu wiersze będą w fizycznej kolejności, ale może się to zmienić w dowolnym momencie przy dowolnej operacji zapisu do tabeli lub
VACUUM
lub inne wydarzenia.
Jest to środek ostateczny i będzie przerwa. -
Przedstawione zapytanie było nieprawidłowe z kilku powodów:brak nazwy kolumny w 1. CTE, brak nazwy tabeli w 2. CTE, ...
-
Nie potrzebujesz do tego CTE.
Łatwiej dzięki DISTINCT ON
(rozważania dla ctid
zastosuj to samo):
SELECT DISTINCT ON (id)
id, status
FROM status
WHERE date >= '2015-06-01'
AND date < '2015-07-01'
ORDER BY id, date, ctid;