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
.