array_agg
array_agg
Description
array_agg
は、列の値(NULL
を含む)を配列にまとめ(複数行を1行にまとめる)、必要に応じて指定した列で要素を並べ替えることができる関数です。v3.0以降、array_agg()
はORDER BYを使用して要素をソートすることができます。
Syntax
ARRAY_AGG([distinct] col [order by col0 [desc | asc] [nulls first | nulls last] ...])
Parameters
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]
: NULL値を最初または最後に配置するかを指定します。
Return value
オプションでcol0
でソートされたARRAY型の値を返します。
Usage notes
- 配列の 要素の順序はランダムであり、ORDER BY列が指定されていない場合やソートされていない場合は、列の値の順序と異なる場合があります。
- 返される配列の要素のデータ型は、列の値のデータ型と同じです。
- 入力が空であってもグループ化された列が存在しない場合、
NULL
を返します。
Examples
以下のデータテーブルを例にします:
mysql> select * from t;
+------+------+------+
| a | name | pv |
+------+------+------+
| 11 | | 33 |
| 2 | NULL | 334 |
| 1 | fzh | 3 |
| 1 | fff | 4 |
| 1 | fff | 5 |
+------+------+------+
Example 1: 列a
の値をグループ化し、列pv
の値を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)
Example 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)
Example 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)
-- 並び替えなしで値をまとめる。
mysql> select array_agg(pv) from t where a < 0;
+---------------+
| array_agg(pv) |
+---------------+
| NULL |
+---------------+
1 row in set (0.03 sec)
Keywords
ARRAY_AGG, ARRAY