PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Equivalente Oracle do DISTINCT ON do Postgres?


O mesmo efeito pode ser replicado no Oracle usando o first_value() função ou usando uma das funções rank() ou row_number() funções.

Ambas as variantes também funcionam no Postgres.

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

first_value dá o primeiro valor para a partição, mas o repete para cada linha, então é necessário usá-lo em combinação com distinct para obter uma única linha para cada partição.

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

Substituindo row_number() com rank() neste exemplo produz o mesmo resultado.

Uma característica desta variante é que ela pode ser usada para buscar o primeiro N linhas para uma determinada partição (por exemplo, "últimos 3 atualizados") simplesmente alterando rownumber = 1 para rownumber <= N .