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
.