sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Equivalente de Oracle de DISTINCT ON de Postgres?

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 .