Аналитическая функция Oracle Rank () - PullRequest
0 голосов
/ 18 марта 2012

Если я поставлю 3 имени в ряд:

Ковач Альберт, Ковач Давид, Надь Балаш

Конечно, Ковач, Надя

Фамилия - Альберт, Давид, Балаш

И если я запусту аналитическую функцию rank() для Фамилии, то что получится?

1-Kovács Albert
1-Kovács Dávid
3-Nagy Balázs

OR

1-Kovács Dávid
1-Kovács Albert
3-Nagy Balázs

ИЛИ это будет случайно?

У меня не установлен оракул на моем компьютере, если вы можете дать мне бесплатный онлайн-учебник, я был бы признателен ...

Ответы [ 2 ]

2 голосов
/ 18 марта 2012

Если вы сделаете запрос, подобный этому, на Familyname.Вывод будет выглядеть так:

1-Kovács Albert
1-Kovács Dávid
1-Nagy Balázs

С этим запросом:

SELECT
  RANK() OVER(PARTITION BY FamilyName ORDER BY FamilyName) AS iRank,
  Surename,
  FamilyName
FROM
  Table1

Если вы сделаете RANK на SureName и order by FamilyName.Вывод будет выглядеть так:

1-Kovács Albert
2-Kovács Dávid
1-Nagy Balázs

С этим запросом:

SELECT
  RANK() OVER(PARTITION BY Surename ORDER BY FamilyName) AS iRank,
  Surename,
  FamilyName
FROM
  Table1
0 голосов
/ 18 марта 2012

Это полностью зависит от того, что вы хотите.Чтобы получить любой из предложенных вами результатов, ваше аналитическое предложение должно быть 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 нет необходимости в заказе набора результатов.

...