array_agg
将一列中的值(包括 NULL
)聚合到一个数组中(多行到一行),并可以选择按特定列对元素进行排序。 从 v3.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(自 v3.1 起)、MAP(自 v3.1 起)和 STRUCT(自 v3.1 起)。 -
col0
:决定col
顺序的列。 可以有多个 ORDER BY 列。 -
[desc | asc]
:指定按col0
的升序(默认)或降序对元素进行排序。 -
[nulls first | nulls last]
:指定将空值放在第一位还是最后一位。
返回值
返回 ARRAY 类型的值,可以选择按 col0
排序。
使用说明
- 数组中元素的顺序是随机的,这意味着如果没有指定 ORDER BY 列或没有指定排序依据列,则它可能与列中值的顺序不同。
- 返回数组中元素的数据类型与列中值的数据类型相同。
- 如果输入为空且没有 group-by 列,则返回
NULL
。 - 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
中的值进行分组,并通过按 name
排序 a
将列 pv
中的值聚合到数组中。
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] |
+------+---------------------------------+
-- Aggregate values with no order.
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:通过按 name
排序将列 pv
中的值聚合到数组中。
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)
-- Aggregate values with no order.
mysql> select array_agg(pv) from t;
+----------------+
| array_agg(pv) |
+----------------+
| [3,4,5,33,334] |
+----------------+
1 row in set (0.03 sec)
示例 3:使用 WHERE 子句将列 pv
中的值聚合到数组中。 如果 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)
-- Aggregate values with no order.
mysql> select array_agg(pv) from t where a < 0;
+---------------+
| array_agg(pv) |
+---------------+
| NULL |
+---------------+
1 row in set (0.03 sec)
关键词
ARRAY_AGG, 数组