Рейтинг Postgres

Rejting Postgres



В PostgreSQL функция rank() — это функция окна, которая позволяет нам присваивать ранг каждой строке в результирующем наборе на основе заданных критериев сортировки. Как и большинство оконных функций, функция ранга полезна в аналитических запросах, таких как определение ранга строки относительно других в заданном наборе результатов.

В этом руководстве рассказывается, как работать с функциями 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()

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

ВЫБЕРИТЕ значение, RANK() OVER (ORDER BY value) КАК ранг
ОТ (
ЗНАЧЕНИЯ (10), (20), (5), (15), (10)
) AS данные(значение);

В этом примере мы ранжируем значения в порядке возрастания. Двум вхождениям значения присваивается один и тот же ранг, поскольку они похожи и появляются в одной и той же позиции в порядке.



В результате таблица выглядит следующим образом:

ВЫБЕРИТЕ значение, RANK() OVER (PARTITION BY value % 2 ORDER BY value) КАК ранг
ОТ (
ЗНАЧЕНИЯ (10), (20), (5), (15), (10)
) AS данные(значение);

Пример функции PostgreSQL Rank() с предложением Partition By

Рассмотрим следующий пример:

ВЫБЕРИТЕ значение, RANK() OVER (PARTITION BY value % 2 ORDER BY value) КАК ранг
ОТ (
ЗНАЧЕНИЯ (10), (20), (5), (15), (10)
) AS данные(значение);

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

В результате набор выглядит следующим образом:

Пример функции PostgreSQL Rank() путем объединения нескольких функций SQL

Вы также можете создавать более сложные запросы, используя функцию rank(). Например, возьмем базу данных Pagila. Предположим, мы хотим получить пять лучших клиентов на основе их общих арендных платежей и присвоить им ранги.

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

ВЫБЕРИТЕ customer_id, имя, фамилию, общее количество_платежей,
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
) КАК клиент_платежи
ЗАКАЗАТЬ ПО РАНГУ
ПРЕДЕЛ 10;

В этом примере мы выбираем customer_id, first_name, last_name, total_payment и назначенный rank(). Затем мы используем функцию rank() для присвоения ранга каждому клиенту на основе total_payment, отсортированного в порядке убывания.

Внутренний подзапрос позволяет нам рассчитать общую сумму платежей для каждого клиента, объединив таблицы клиентов и платежей. Затем мы группируем результат на основе столбцов customer_id, first_name и last_name, чтобы получить сумму платежей для каждого клиента.

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

Как видите, вы можете генерировать более подробные данные, комбинируя несколько функций SQL, таких как сортировка, фильтрация, агрегаты, объединения и многое другое.

Заключение

Мы рассмотрели, как мы можем работать с функцией rank() в PostgreSQL, чтобы получить ранг данной строки из набора результатов на основе определенных условий. Мы также рассмотрели, как комбинировать функцию rank() с другими инструментами SQL для создания более сложных запросов.