Это полностью зависит от того, что вы хотите.Чтобы получить любой из предложенных вами результатов, ваше аналитическое предложение должно быть rank() over ( order by surname )
.Этот запрос предоставляет вам rank
каждой записи в порядке возрастания surname
.Поскольку у вас есть два человека с одинаковой фамилией, то порядок этих двух людей должен теоретически быть случайным.Это связано с тем, что rank()
на самом деле не выполняет никакого упорядочения набора результатов, для этого необходимо предложение order by
;или хотя бы для гарантии желаемых результатов.
Что-то вроде:
select rank() over ( order by surname asc, familyname asc ) as rnk
, surname, familyname
from my_table
order by rank() over ( order by surname asc, familyname asc )
Этот запрос возвращает фамилию, фамилию и ранг в порядке возрастания фамилии и фамилии.Набор результатов упорядочен по рангу, что означает, что он будет выглядеть следующим образом:
1 | Kovács | Albert
2 | Kovács | Dávid
3 | Nagy | Balázs
Это преимущество и проблема с аналитическими функциями, вы можете быть очень специфичными в том, что вы хотите сделать, ноесли вы хотите получить конкретный ответ, вы должны быть точными в выполняемом запросе.
Документация предоставляет другой пример с использованием предложения partition by
.Если бы мы применили это к вашему запросу, разделив по surname
и упорядочив по familyname
, ваш запрос и набор результатов могли бы выглядеть следующим образом.
select rank() over ( partition by surname order by familyname asc ) as rnk
, surname, familyname
from my_table
2 | Kovács | Dávid
1 | Kovács | Albert
1 | Nagy | Balázs
Это означает, что мы оцениваем все фамилии для каждой фамилии в отдельности.Поскольку Давид преследует Альберта, он получает звание 2 в фамилии Ковач.Обратите внимание, что без указания конкретного order by
нет необходимости в заказе набора результатов.