Перейти к основному содержимому

array_agg

Описание

Агрегирует значения (включая NULL) в столбце в массив (несколько строк в одну строку) и опционально упорядочивает элементы по определенным столбцам. Начиная с версии 1.5.0, array_agg() поддерживает использование ORDER BY для сортировки элементов.

Синтаксис

ARRAY_AGG([distinct] col [order by col0 [desc | asc] [nulls first | nulls last] ...])

Параметры

  • col: столбец, значения которого вы хотите агрегировать. Поддерживаемые типы данных: BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, VARCHAR, CHAR, DATETIME, DATE, ARRAY (с версии 3.1), MAP (с версии 3.1) и STRUCT (с версии 3.1).

  • col0: столбец, который определяет порядок col. Может быть более одного столбца ORDER BY.

  • [desc | asc]: указывает, сортировать ли элементы в порядке возрастания (по умолчанию) или убывания col0.

  • [nulls first | nulls last]: указывает, размещать ли null значения в начале или в конце.

Возвращаемое значение

Возвращает значение типа ARRAY, опционально отсортированное по col0.

Примечания по использованию

  • Порядок элементов в массиве случайный, что означает, что он может отличаться от порядка значений в столбце, если не указаны столбцы ORDER BY или нет сортировки по столбцам order by.
  • Тип данных элементов в возвращаемом массиве такой же, как тип данных значений в столбце.
  • Возвращает NULL, если входные данные пусты и нет столбцов group-by.
  • ARRAY_AGG_DISTINCT() является псевдонимом ARRAY_AGG(DISTINCT).

Примеры

Рассмотрим следующую таблицу данных в качестве примера:

mysql> select * from t;
+------+------+------+
| a | name | pv |
+------+------+------+
| 11 | | 33 |
| 2 | NULL | 334 |
| 1 | fzh | 3 |
| 1 | fff | 4 |
| 1 | fff | 5 |
+------+------+------+

Пример 1: Группируем значения в столбце a и агрегируем значения в столбце pv в массив, упорядочивая a по name.

mysql> select a, array_agg(pv order by name nulls first) from t group by a;
+------+---------------------------------+
| a | array_agg(pv ORDER BY name ASC) |
+------+---------------------------------+
| 2 | [334] |
| 11 | [33] |
| 1 | [4,5,3] |
+------+---------------------------------+

-- Агрегируем значения без порядка.
mysql> select a, array_agg(pv) from t group by a;
+------+---------------+
| a | array_agg(pv) |
+------+---------------+
| 11 | [33] |
| 2 | [334] |
| 1 | [3,4,5] |
+------+---------------+
3 rows in set (0.03 sec)

Пример 2: Агрегируем значения в столбце pv в массив с упорядочиванием по name.

mysql> select array_agg(pv order by name desc nulls last) from t;
+----------------------------------+
| array_agg(pv ORDER BY name DESC) |
+----------------------------------+
| [3,4,5,33,334] |
+----------------------------------+
1 row in set (0.02 sec)

-- Агрегируем значения без порядка.
mysql> select array_agg(pv) from t;
+----------------+
| array_agg(pv) |
+----------------+
| [3,4,5,33,334] |
+----------------+
1 row in set (0.03 sec)

Пример 3: Агрегируем значения в столбце pv с использованием предложения WHERE. Если никакие данные в pv не соответствуют условию фильтра, возвращается значение NULL.

mysql> select array_agg(pv order by name desc nulls last) from t where a < 0;
+----------------------------------+
| array_agg(pv ORDER BY name DESC) |
+----------------------------------+
| NULL |
+----------------------------------+
1 row in set (0.02 sec)

-- Агрегируем значения без порядка.
mysql> select array_agg(pv) from t where a < 0;
+---------------+
| array_agg(pv) |
+---------------+
| NULL |
+---------------+
1 row in set (0.03 sec)

Ключевые слова

ARRAY_AGG, ARRAY