El mismo efecto se puede replicar en Oracle usando el first_value()
función o usando uno de los rank()
o row_number()
funciones
Ambas variantes también funcionan en Postgres.
first_value()
select distinct col1,
first_value(col2) over (partition by col1 order by col2 asc)
from tmp
first_value
da el primer valor para la partición, pero lo repite para cada fila, por lo que es necesario usarlo en combinación con distinct
para obtener una sola fila para cada partición.
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
Reemplazando row_number()
con rank()
en este ejemplo produce el mismo resultado.
Una característica de esta variante es que se puede usar para obtener el primer N filas para una partición dada (por ejemplo, "las últimas 3 actualizadas") simplemente cambiando rownumber = 1
a rownumber <= N
.