PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Ordre de tri déterministe pour les fonctions de fenêtre

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;