Si no tienes slno
en su tabla, entonces no tiene ninguna información confiable sobre qué fila se insertó primero. No existe un orden natural en una tabla, el orden físico de las filas puede cambiar en cualquier momento (con cualquier actualización o con VACUUM
, etc)
podrías utiliza un poco fiable truco:ordenar por el 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;
-
En ausencia de cualquier otra información, qué fila apareció primero (que es un error de diseño para empezar, ¡arréglelo!), puede intentar guardar lo que pueda usando el ID de tupla
ctid
Las filas estarán en orden físico cuando se inserten inicialmente, pero eso puede cambiar en cualquier momento con cualquier operación de escritura en la tabla o
VACUUM
u otros eventos.
Esta es una medida de último recurso y será descanso. -
Su consulta presentada no era válida por varios motivos:falta el nombre de la columna en la 1.ª CTE, falta el nombre de la tabla en la 2.ª CTE, ...
-
No necesitas un CTE para esto.
Más simple con DISTINCT ON
(consideraciones para ctid
aplicar lo mismo):
SELECT DISTINCT ON (id)
id, status
FROM status
WHERE date >= '2015-06-01'
AND date < '2015-07-01'
ORDER BY id, date, ctid;