メインコンテンツまでスキップ
バージョン: Latest-3.4

array_agg

列内の値(NULL を含む)を配列に集約し(複数行を1行に)、特定の列で要素を並べ替えることができます。バージョン 3.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]: NULL 値を最初または最後に配置するかを指定します。

戻り値

ARRAY 型の値を返し、col0 によってオプションで並べ替えられます。

使用上の注意

  • 配列内の要素の順序はランダムであり、ORDER 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 の値をグループ化し、列 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)

例 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: 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)

キーワード

ARRAY_AGG, ARRAY