Ако нямате slno
във вашата таблица, тогава нямате надеждна информация кой ред е вмъкнат първи. Няма естествен ред в таблица, физическият ред на редовете може да се промени по всяко време (с всяка актуализация или с VACUUM
и т.н.)
Вие можете използвайте ненадежден трик:подредете по вътрешния 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;
-
При липса на друга информация кой ред е бил първи (което е грешка при проектирането като за начало, поправете го!), можете да опитате да запазите каквото можете, като използвате вътрешния идентификатор на кортеж
ctid
Редовете ще бъдат във физически ред, когато бъдат вмъкнати първоначално, но това може да се промени по всяко време с всяка операция за запис в таблицата или
VACUUM
или други събития.
Това е крайна мярка и ще прекъсване -
Представената от вас заявка беше невалидна по няколко причини:липсващо име на колона в 1-во CTE, липсващо име на таблица във 2-ро CTE, ...
-
За това нямате нужда от CTE.
По-лесно с DISTINCT ON
(съображения за ctid
прилагайте същото):
SELECT DISTINCT ON (id)
id, status
FROM status
WHERE date >= '2015-06-01'
AND date < '2015-07-01'
ORDER BY id, date, ctid;