Si vous n'avez pas slno dans votre tableau, vous ne disposez d'aucune information fiable sur la ligne insérée en premier. Il n'y a pas d'ordre naturel dans une table, l'ordre physique des lignes peut changer à tout moment (avec n'importe quelle mise à jour, ou avec VACUUM , etc.)
Vous pourriez utiliser un non fiable astuce :trier par le ctid interne .
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 l'absence de toute autre information, quelle ligne est arrivée en premier (ce qui est une erreur de conception pour commencer, corrigez-le !), vous pouvez essayer de sauvegarder ce que vous pouvez en utilisant le ID de tuple
ctidLes lignes seront dans l'ordre physique lors de leur insertion initiale, mais cela peut changer à tout moment avec n'importe quelle opération d'écriture dans la table ou
VACUUMou d'autres événements.
Il s'agit d'une mesure de dernier recours et elle sera pause. -
Votre requête présentée était invalide à plusieurs égards :nom de colonne manquant dans le 1er CTE, nom de table manquant dans le 2e CTE, ...
-
Vous n'avez pas besoin d'un CTE pour cela.
Plus simple avec DISTINCT ON (considérations pour ctid appliquer la même chose) :
SELECT DISTINCT ON (id)
id, status
FROM status
WHERE date >= '2015-06-01'
AND date < '2015-07-01'
ORDER BY id, date, ctid;