Агрегатные функции
Агрегатные функции — это функции, которые объединяют значения из нескольких строк в одно.
Агрегатные функции отличаются от скалярных функций и оконных функций тем, что они изменяют кардинальность результата. Поэтому в запросах их можно использовать только в выражениях SELECT
и HAVING
.
Выражение DISTINCT
в агрегатных функциях
Когда используется выражение DISTINCT
, при вычислении значения агрегатной функции учитываются только уникальные значения. Часто это выражение используется в сочетании с агрегатной функцией count()
для получения количества уникальных элементов, но может использоваться и с другими агрегатными функциями.
Пример
CREATE TABLE cities(city_name VARCHAR);
INSERT INTO cities VALUES
('Moscow'),
('Moscow'),
('Paris'),
('Madrid');
SELECT
count(DISTINCT city_name) as distinct_cities_num,
count(city_name) as cities_num
FROM cities;
+---------------------+------------+
| distinct_cities_num | cities_num |
+---------------------+------------+
| 3 | 4 |
+---------------------+------------+
array_agg()
Описание |
Возвращает список, содержащий все значения столбца. |
Использование |
|
Псевдонимы |
|
На работу этой функции влияет порядок сортировки в таблице. |
Посмотреть пример
CREATE TABLE numbers(number BIGINT);
INSERT INTO numbers VALUES
(1),
(2),
(3),
(Null);
SELECT
array_agg(number) as array_agg,
list(number) as list
FROM numbers;
+--------------+--------------+
| array_agg | list |
+--------------+--------------+
| {1,2,3,None} | {1,2,3,None} |
+--------------+--------------+
avg()
Описание |
Вычисляет среднее значение всех непустых значений в |
Использование |
|
Псевдонимы |
|
Посмотреть пример
CREATE TABLE numbers(number BIGINT);
INSERT INTO numbers VALUES
(1),
(2),
(3),
(Null);
SELECT
avg(number) AS average,
mean(number) AS mean
FROM numbers;
+---------+------+
| average | mean |
+---------+------+
| 2 | 2 |
+---------+------+
count()
Описание |
Вычисляет количество строк в группе. |
Использование |
|
Псевдонимы |
|
Посмотреть пример
CREATE TABLE numbers(number BIGINT);
INSERT INTO numbers VALUES
(1),
(2),
(3),
(Null);
SELECT
count() AS rows_count,
count(*) AS rows_count_star
FROM numbers;
+------------+-----------------+
| rows_count | rows_count_star |
+------------+-----------------+
| 4 | 4 |
+------------+-----------------+
count(argument)
Описание |
Вычисляет количество непустых значений в |
Использование |
|
Посмотреть пример
CREATE TABLE numbers(number BIGINT);
INSERT INTO numbers VALUES
(1),
(2),
(3),
(Null);
SELECT
count() AS rows_count,
count(number) AS values_count
FROM numbers;
+------------+--------------+
| rows_count | values_count |
+------------+--------------+
| 4 | 3 |
+------------+--------------+
max()
Описание |
Возвращает максимальное значение, имеющееся в |
Использование |
|
Посмотреть пример
CREATE TABLE numbers(number BIGINT);
INSERT INTO numbers VALUES
(1),
(2),
(3),
(Null);
SELECT
max(number) as max,
min(number) as min
FROM numbers;
+-----+-----+
| max | min |
+-----+-----+
| 3 | 1 |
+-----+-----+
min()
Описание |
Возвращает минимальное значение, имеющееся в |
Использование |
|
Посмотреть пример
CREATE TABLE numbers(number BIGINT);
INSERT INTO numbers VALUES
(1),
(2),
(3),
(Null);
SELECT
max(number) as max,
min(number) as min
FROM numbers;
+-----+-----+
| max | min |
+-----+-----+
| 3 | 1 |
+-----+-----+
median()
Описание |
Возвращает медианное значение всех непустых значений в |
Использование |
|
В случае четного количества значений берется среднее между двумя центральными значениями.
Посмотреть пример
Покажем разницу между медианным значением и средним значением (avg()
) на примерах наборов из четного (_even
) и нечетного (_odd
) количества чисел, содержащих в том числе пустые значения.
CREATE TABLE numbers(
number_even BIGINT,
number_odd BIGINT);
INSERT INTO numbers VALUES
(1, 1),
(2, 2),
(3, 10),
(10, Null),
(Null, Null);
SELECT
median(number_even) as median_even,
avg(number_even) as avg_even,
median(number_odd) as median_odd,
avg(number_odd) as avg_odd
FROM numbers;
+-------------+----------+------------+-------------------+
| median_even | avg_even | median_odd | avg_odd |
+-------------+----------+------------+-------------------+
| 2.5 | 4 | 2 | 4.333333333333333 |
+-------------+----------+------------+-------------------+
sum()
Описание |
Вычисляет сумму всех непустых значений в |
Использование |
|
В случае булевых значений подсчитывает количество значений True
.
Посмотреть пример
CREATE TABLE numbers(
number BIGINT,
boolean BOOL);
INSERT INTO numbers VALUES
(1, True),
(2, False),
(3, False),
(Null, Null);
SELECT
sum(number) as sum_number,
sum(boolean) as sum_boolean
FROM numbers;
+------------+-------------+
| sum_number | sum_boolean |
+------------+-------------+
| 6 | 1 |
+------------+-------------+