Stejný efekt lze replikovat v Oracle buď pomocí first_value()
nebo pomocí jednoho z rank()
nebo row_number()
funkcí.
Obě varianty fungují také v Postgresu.
first_value()
select distinct col1,
first_value(col2) over (partition by col1 order by col2 asc)
from tmp
first_value
dává první hodnotu pro oddíl, ale opakuje ji pro každý řádek, takže je nutné ji použít v kombinaci s distinct
získat jeden řádek pro každý oddíl.
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
Nahrazení row_number()
pomocí rank()
v tomto příkladu dává stejný výsledek.
Charakteristickým rysem této varianty je, že ji lze použít k načtení prvního N řádků pro daný oddíl (např. "poslední 3 aktualizovány") jednoduše změnou rownumber = 1
do rownumber <= N
.