Den samme effekt kan replikeres i Oracle enten ved at bruge first_value()
funktion eller ved at bruge en af rank()
eller row_number()
funktioner.
Begge varianter fungerer også i Postgres.
first_value()
select distinct col1,
first_value(col2) over (partition by col1 order by col2 asc)
from tmp
first_value
giver den første værdi for partitionen, men gentager den for hver række, så det er nødvendigt at bruge den i kombination med distinct
for at få en enkelt række for hver 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
Erstatter row_number()
med rank()
i dette eksempel giver det samme resultat.
En funktion ved denne variant er, at den kan bruges til at hente det første N rækker for en given partition (f.eks. "sidste 3 opdaterede") blot ved at ændre rownumber = 1
til rownumber <= N
.