メインコンテンツまでスキップ

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