Se você não tiver
slno
em sua tabela, então você não tem nenhuma informação confiável sobre qual linha foi inserida primeiro. Não há ordem natural em uma tabela, a ordem física das linhas pode mudar a qualquer momento (com qualquer atualização ou com VACUUM
, etc) Você poderia use um não confiável truque:ordenar pelo
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;
-
Na ausência de qualquer outra informação, qual linha veio primeiro (o que é um erro de design para começar, conserte!), você pode tentar salvar o que puder usando o ID da tuplactid
As linhas estarão em ordem física quando inseridas inicialmente, mas isso pode mudar a qualquer momento com qualquer operação de gravação na tabela ouVACUUM
ou outros eventos.
Esta é uma medida de último recurso e será quebrar.
-
Sua consulta apresentada era inválida em vários aspectos:nome da coluna ausente no 1º CTE, nome da tabela ausente no 2º CTE, ...
-
Você não precisa de um CTE para isso.
Mais simples com
DISTINCT ON
(considerações para ctid
aplicar o mesmo):SELECT DISTINCT ON (id)
id, status
FROM status
WHERE date >= '2015-06-01'
AND date < '2015-07-01'
ORDER BY id, date, ctid;