Samma effekt kan replikeras i Oracle antingen genom att använda first_value() funktion eller genom att använda någon av rank() eller row_number() funktioner.
Båda varianterna fungerar även i Postgres.
first_value()
select distinct col1,
first_value(col2) over (partition by col1 order by col2 asc)
from tmp
first_value ger det första värdet för partitionen, men upprepar det för varje rad, så det är nödvändigt att använda det i kombination med distinct för att få en enda rad för varje 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
Ersätter row_number() med rank() i detta exempel ger samma resultat.
En egenskap hos denna variant är att den kan användas för att hämta det första N rader för en given partition (t.ex. "senast 3 uppdaterade") genom att helt enkelt ändra rownumber = 1 till rownumber <= N .