Данная статья относится к циклу статей, посвященных PostgreSQL. В предыдущей статье мы говорили о естественном объединении PostgreSQL. Теперь же мы углубимся в изучение условия GROUP BY, при помощи которого мы будем разделять строки на группы.
Введение в условие PostgreSQL GROUP BY
Условие GROUP BY разбивает строки, возвращаемые оператором SELECT, на группы. Для каждой группы можно применить агрегатную функцию, например, SUM() для расчёта суммы элементов или COUNT() для получения количества элементов в группах.
Следующий запрос отображает синтаксис вызова условия GROUP BY:
SELECT column_1, aggregate_function(column_2)
FROM tbl_name
GROUP BY column_1;
Условие GROUP BY ставится сразу после условия FROM или WHERE. После условия GROUP BY следует один столбец или список столбцов, разделённых запятыми. Помимо столбца таблицы вы также можете использовать выражение с условием GROUP BY.
Примеры использования условия PostgreSQL GROUP BY
Для наглядности мы возьмём таблицу payment из примера базы данных.
A) Пример использования условия PostgreSQL GROUP BY без агрегатной функции
Вы можете использовать условие GROUP BY без применения агрегатной функции. Следующий запрос получает данные из таблицы payment и группирует результат по customer_id.
SELECT
customer_id
FROM
payment
GROUP BY
customer_id;
В данном случае условие GROUP BY выступает в роли условия DISTINCT, которое убирает повторяющиеся строки из набора результатов.
B) Пример использования условия PostgreSQL GROUP BY с агрегатной функцией SUM()
Условие GROUP BY полезно в тех случаях, когда оно используется вместе с агрегатной функцией. Например, чтобы узнать, сколько было выплачено клиенту — используйте условие GROUP BY, чтобы разбить таблицу payments на группы; в каждой из которых вычисляется общая сумма денег при помощи функции SUM(), как показано в следующем запросе:
SELECT
customer_id,
SUM (amount)
FROM
payment
GROUP BY
customer_id;
Условие GROUP BY сортирует набор результатов по customer_id и суммирует количество денег, принадлежащих одному и тому же клиенту. Всякий раз, когда customer_id изменяется, в возвращаемый набор результатов добавляется новая строка.
Вы можете использовать условие ORDER BY с условием GROUP BY, чтобы сортировать группы:
SELECT
customer_id,
SUM (amount)
FROM
payment
GROUP BY
customer_id
ORDER BY
SUM (amount) DESC;
C) Пример использования условия PostgreSQL GROUP BY с агрегатной функцией COUNT()
Чтобы подсчитать количество транзакций, которые обработал каждый сотрудник, сгруппируйте таблицу payments по staff_id, а затем воспользуйтесь функцией COUNT(), чтобы получить количество транзакций, как показано в запросе ниже:
SELECT
staff_id,
COUNT (payment_id)
FROM
payment
GROUP BY
staff_id;
Условие GROUP BY сортирует набор результатов по staff_id, оно хранит промежуточный итог строк, и всякий раз, когда staff_id изменяется, добавляет строку в возвращаемый набор результатов.
Для фильтрации групп, используйте условие HAVING вместо условия WHERE.
В этом руководства вы узнали, как использовать условие PostgreSQL GROUP BY для разделения строк на группы. В следующий раз мы поговорим об условии PostgreSQL HAVING.
Источник: PostgreSQL Tutorial from Scratch