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

Équivalent Oracle de DISTINCT ON de Postgres?

Le même effet peut être reproduit dans Oracle soit en utilisant le first_value() fonction ou en utilisant l'un des rank() ou row_number() les fonctions.

Les deux variantes fonctionnent également dans Postgres.

first_value()

select distinct col1, 
first_value(col2) over (partition by col1 order by col2 asc)
from tmp

first_value donne la première valeur pour la partition, mais la répète pour chaque ligne, il est donc nécessaire de l'utiliser en combinaison avec distinct pour obtenir une seule ligne pour chaque partition.

row_number() / rank()

select col1, col2 from (
  select col1, col2, 
  row_number() over (partition by col1 order by col2 asc) as rownumber 
  from tmp
) foo
where rownumber = 1

Remplacement de row_number() avec rank() dans cet exemple donne le même résultat.

Une caractéristique de cette variante est qu'elle peut être utilisée pour récupérer le premier N lignes pour une partition donnée (par exemple "les 3 dernières mises à jour") en changeant simplement rownumber = 1 à rownumber <= N .