Агрегатные функции

Агрегатные функции — это функции, которые объединяют значения из нескольких строк в одно.

Агрегатные функции отличаются от скалярных функций и оконных функций тем, что они изменяют кардинальность результата. Поэтому в запросах их можно использовать только в выражениях 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          |
+---------------------+------------+

Некоторые агрегатные функции нечувствительны к повторяющимся значениям (например, min() и max()), и для них выражение DISTINCT игнорируется.

array_agg()

Описание

Возвращает список, содержащий все значения столбца.

Использование

array_agg(argument)

Псевдонимы

list()

На работу этой функции влияет порядок сортировки в таблице.
Посмотреть пример
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()

Описание

Вычисляет среднее значение всех непустых значений в argument.

Использование

avg(argument)

Псевдонимы

mean()

Посмотреть пример
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()

Описание

Вычисляет количество строк в группе.

Использование

count()

Псевдонимы

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)

Описание

Вычисляет количество непустых значений в argument.

Использование

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()

Описание

Возвращает максимальное значение, имеющееся в argument.

Использование

max(argument)

Посмотреть пример
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()

Описание

Возвращает минимальное значение, имеющееся в argument.

Использование

min(argument)

Посмотреть пример
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()

Описание

Возвращает медианное значение всех непустых значений в argument.

Использование

median(argument)

В случае четного количества значений берется среднее между двумя центральными значениями.

Посмотреть пример

Покажем разницу между медианным значением и средним значением (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()

Описание

Вычисляет сумму всех непустых значений в argument.

Использование

sum(argument)

В случае булевых значений подсчитывает количество значений 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           |
+------------+-------------+