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