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
.