Группировка данных в PostgreSQL: GROUP BY
Оператор GROUP BY в PostgreSQL используется для группировки результатов по одному или нескольким столбцам таблицы. Он позволяет применять агрегатные функции, такие как COUNT, SUM, AVG, MAX и MIN, к каждой группе, вместо того, чтобы применять функции к всей таблице сразу.
Допустим, у нас есть таблица с данными о продажах товаров, содержащая информацию о дате продажи, продукте и количестве продаж каждого товара за определенный период времени. Для того, чтобы узнать общее количество продаж по каждому продукту, мы можем использовать следующий запрос:
SELECT product, SUM(quantity) as total_sales
FROM sales
GROUP BY product;
Здесь мы сначала выбираем столбцы, которые нам нужны, а затем группируем результаты по столбцу 'product'. В итоге, в каждой группе мы применяем агрегатную функцию SUM к столбцу 'quantity', чтобы получить общее количество продаж в группе.
Также можно использовать GROUP BY для сортировки результатов по группам. Например, чтобы вывести общее количество продаж по каждому продукту, отсортированные по убыванию, мы можем использовать следующий запрос:
SELECT product, SUM(quantity) as total_sales
FROM sales
GROUP BY product
ORDER BY total_sales DESC;
В этом случае мы добавляем сортировку результатов по столбцу 'total_sales' в порядке убывания. Это позволяет нам увидеть самые продаваемые продукты сверху вниз.
Также можно использовать GROUP BY для разбиения результатов на более гранулированные группы. Например, если мы хотим узнать общее количество продаж по каждому продукту за каждый месяц, мы можем воспользоваться следующим запросом:
SELECT product, DATE_TRUNC('month', sale_date) as month, SUM(quantity) as total_sales
FROM sales
GROUP BY product, month;
Здесь мы добавляем столбец с помощью функции DATE_TRUNC, чтобы привести даты продаж к первому дню месяца. Затем мы группируем результаты по столбцам 'product' и 'month', чтобы получить общее количество продаж в каждой группе.
Вот примеры кода для создания и заполнения таблицы и выполнения запросов, использованных в примерах выше:
CREATE TABLE sales (
id SERIAL PRIMARY KEY,
product TEXT NOT NULL,
sale_date DATE NOT NULL,
quantity INT NOT NULL
);
INSERT INTO sales (product, sale_date, quantity)
VALUES
('Product 1', '2021-01-01', 10),
('Product 1', '2021-01-02', 5),
('Product 1', '2021-02-01', 15),
('Product 2', '2021-01-01', 20),
('Product 2', '2021-02-01', 10),
('Product 2', '2021-02-15', 5);
SELECT product, SUM(quantity) as total_sales
FROM sales
GROUP BY product;
SELECT product, SUM(quantity) as total_sales
FROM sales
GROUP BY product
ORDER BY total_sales DESC;
SELECT product, DATE_TRUNC('month', sale_date) as month, SUM(quantity) as total_sales
FROM sales
GROUP BY product, month;