Ten sam efekt można odtworzyć w Oracle za pomocą funkcji first_value()
lub używając jednej z funkcji rank()
lub row_number()
Funkcje.
Oba warianty działają również w Postgresie.
first_value()
select distinct col1,
first_value(col2) over (partition by col1 order by col2 asc)
from tmp
first_value
podaje pierwszą wartość dla partycji, ale powtarza ją dla każdego wiersza, więc konieczne jest użycie jej w połączeniu z distinct
aby uzyskać jeden wiersz dla każdej partycji.
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
Zastępowanie row_number()
z rank()
w tym przykładzie daje ten sam wynik.
Cechą tego wariantu jest to, że można go użyć do pobrania pierwszego N wiersze dla danej partycji (np. „ostatnie 3 zaktualizowane”) po prostu zmieniając rownumber = 1
na rownumber <= N
.