Перейти к основному содержимому
Версия: 2.0.x

array_agg

Агрегирует значения (включая NULL) в столбце в массив (несколько строк в одну строку) и опционально упорядочивает элементы по определенным столбцам. Начиная с версии v1.5.2, 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 (начиная с v1.5.2), MAP (начиная с v1.5.2) и STRUCT (начиная с v1.5.2).

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

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

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

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

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

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

  • Порядок элементов в массиве является случайным, что означает, что он может отличаться от порядка значений в столбце, если не указаны столбцы 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