Същият ефект може да бъде възпроизведен в Oracle или с помощта на first_value()
функция или като използвате един от rank()
или row_number()
функции.
И двата варианта работят и в Postgres.
first_value()
select distinct col1,
first_value(col2) over (partition by col1 order by col2 asc)
from tmp
first_value
дава първата стойност за дяла, но я повтаря за всеки ред, така че е необходимо да се използва в комбинация с distinct
за да получите един ред за всеки дял.
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
Замяна на row_number()
с rank()
в този пример дава същия резултат.
Характеристика на този вариант е, че може да се използва за извличане на първото N редове за даден дял (напр. "последните 3 актуализирани") просто чрез промяна на rownumber = 1
до rownumber <= N
.