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
ctid
Les 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
VACUUM
ou 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;