Postgres ранг

Postgres Rang



В PostgreSQL функцията rank() е функция Window, която ни позволява да присвоим ранг на всеки ред в рамките на набор от резултати въз основа на даден критерии за сортиране. Подобно на повечето прозоречни функции, функцията за ранг е полезна при аналитични заявки, като например определяне на ранга на ред, който е относителен спрямо други в даден набор от резултати.

Този урок изследва как да работите с функциите на PostgreSQL. Ние също така изследваме синтаксиса и параметрите на функцията и разглеждаме някои практически примери.

Функция PostgreSQL Rank().

Следното показва синтаксиса на функцията rank() в PostgreSQL:







RANK() OVER (PARTITION BY partition_expression ORDER BY sort_expression [ASC|DESC])

Започваме с извикване на функцията rank(). След това използваме ключовата дума OVER, за да покажем, че желаем да изпълним операция с функция на прозорец.



Следва PARTITION BY partition_expression. Тази клауза разделя редовете на различни дялове въз основа на даден израз. Класирането се извършва независимо във всеки дял, където целочислената стойност на ранга започва от 1 за всеки нов дял.



И накрая, имаме клаузата ORDER BY, която указва колоната или израза, който определя реда на реда.





Пример за функция PostgreSQL Rank().

Следната заявка демонстрира основен пример за използване на функцията rank() на PostgreSQL:

SELECT стойност, RANK() OVER (ORDER BY стойност) AS ранг
ОТ (
СТОЙНОСТИ (10), (20), (5), (15), (10)
) AS данни (стойност);

В този пример ние класираме стойностите въз основа на техния възходящ ред. Двете повторения на стойността се присвояват с еднакъв ранг, тъй като са сходни и се появяват на една и съща позиция в рамките на поръчката.



Получената таблица е както следва:

SELECT стойност, RANK() OVER (PARTITION BY стойност % 2 ORDER BY стойност) AS ранг
ОТ (
СТОЙНОСТИ (10), (20), (5), (15), (10)
) AS данни (стойност);

Пример за функция PostgreSQL Rank() с клаузата Partition By

Разгледайте следния пример:

SELECT стойност, RANK() OVER (PARTITION BY стойност % 2 ORDER BY стойност) AS ранг
ОТ (
СТОЙНОСТИ (10), (20), (5), (15), (10)
) AS данни (стойност);

В този пример добавихме клаузата PARTITION BY с израз, който проверява дали стойността е четно или нечетно число. Това трябва ефективно да групира стойностите в два дяла: един за четни числа (където остатъкът е 0), а другият за нечетни числа (където остатъкът е 1).

Полученият набор е както следва:

Пример за функция PostgreSQL Rank() чрез комбиниране на множество SQL функции

Можете също да създавате по-сложни заявки, като използвате функцията rank(). Вземете например базата данни Pagila. Да предположим, че искаме да извлечем първите пет клиенти въз основа на техните общи плащания за наем и да им присвоим рангове.

Можем да използваме функцията rank(), както е показано в следната заявка:

ИЗБЕРЕТЕ customer_id, first_name, last_name, total_payments,
RANK() OVER (ORDER BY total_payments DESC) КАТО ранг
ОТ (
ИЗБЕРЕТЕ c.customer_id, c.first_name, c.last_name, SUM(p.amount) AS total_payments
ОТ клиент c
ПРИСЪЕДИНЕТЕ плащане p ON c.customer_id = p.customer_id
ГРУПИРАНЕ ПО c.customer_id, c.first_name, c.last_name
) AS customer_payments
ПОРЪЧАЙТЕ ПО ранг
ОГРАНИЧЕНИЕ 10;

В този пример избираме customer_id, first_name, last_name, total_payment и присвоения rank(). След това използваме функцията rank(), за да присвоим ранг на всеки клиент въз основа на total_payment, който е сортиран в низходящ ред.

Вътрешната подзаявка ни позволява да изчислим общите плащания за всеки клиент, като съединим таблиците за клиенти и плащания. След това групираме резултата въз основа на колоните customer_id, first_name и last_name, за да извлечем сумата на плащанията за всеки клиент.

Накрая във външната заявка прилагаме функцията rank() върху набора от резултати и го подреждаме по total_payments във възходящ ред. Ние също така включваме клаузата за ограничение за извличане само на първите 10 реда.

Както можете да видите, можете да генерирате по-проницателни данни чрез комбиниране на множество SQL функции като сортиране, филтриране, агрегати, обединения и други.

Заключение

Проучихме как можем да работим с функцията rank() в PostgreSQL, за да извлечем ранга на даден ред от набор от резултати въз основа на дефинираните условия. Също така разгледахме как да комбинираме функцията rank() с други SQL инструменти, за да създадем по-сложни заявки.