すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:GROUP_CONCAT関数によって提供される機能を実装する

最終更新日:Jan 20, 2025

GROUP_CONCATは、MySQLによって提供される集計関数です。 この関数は、group byを使用して生成された各グループの複数の行の列値を独立した文字列に連結するために使用されます。 この機能は、複数のデータレコードを1つのデータレコードに結合する場合に使用できます。 MaxComputeでWM_CONCAT関数を使用して、GROUP_CONCAT関数と同じ効果を実装できます。

例:

price_totalという名前のテーブルには、name、price、およびsaleidの列が含まれます。 テーブルには次のデータが含まれています。

+--------+------------+------------+
| name   | price      | saleid     |
+--------+------------+------------+
| bag    | 50         | 1          |
| sugar  | 20         | 3          |
| noodle | 2          | 4          |
| potato | 5          | 6          |
| bag    | 100        | 2          |
| sugar  | 10         | 4          |
| potato | 4          | 3          |
| sugar  | 50         | 7          |
| noodle | 2          | 5          |
| noodle | 5          | 1          |
+--------+------------+------------+

この例では、すべての製品は、テーブルの名前列である製品名によってグループ化されています。 MySQLでGROUP_CONCAT関数を使用すると、次の要件を満たすことができます。

  • 要件1: 同じグループの価格列の値をマージします。 返される結果には重複する値が含まれます。 例:

    SELECT name, group_concat(price) FROM price_total GROUP BY name;
  • 要件2: 同じグループの価格列の値をマージします。 返された結果に重複する値は含まれません。 例:

    SELECT name, group_concat(distinct price) FROM price_total GROUP BY name;
  • 要件3: 同じグループの価格列の値をマージして並べ替えます。 返される結果には重複する値が含まれます。 サンプル文:

    SELECT name, group_concat(price ORDER BY price desc) FROM price_total GROUP BY name;
  • 要件4: 同じグループの価格列の値をマージして並べ替えます。 返された結果に重複する値は含まれません。 サンプル文:

    SELECT name, group_concat(distinct price ORDER BY price desc) FROM price_total GROUP BY name;
  • 要件5: 同じグループの価格列の値とsaleid列の値をマージします。 サンプル文:

    SELECT name, group_concat(concat_ws(':', price, saleid)) FROM price_total GROUP BY name;

解決策

MaxComputeはGROUP_CONCAT関数をサポートしていません。 この例の要件を満たすために、WM_CONCAT関数を使用できます。

WM_CONCAT関数はGROUP_CONCAT関数と同じではないことに注意してください。 次の表に、関数の機能を示します。

機能

WM_CONCAT

GROUP_CONCAT

説明

DISTINCTを使用した重複排除

已开通

已开通

なし。

区切り文字

已开通

已开通

区切り文字を使用して、マージする値を連結できます。 WM_CONCATおよびGROUP_CONCAT関数に区切り文字を含めるときは、次の点に注意してください。

  • WM_CONCAT関数を使用する場合、区切り文字は省略できません。

  • GROUP_CONCAT関数を使用する場合は、区切り文字を省略できます。 区切り文字を省略した場合は、区切り文字としてコンマ (,) が使用されます。

並べ替え

已开通

已开通

値をソートする場合は、次の方法を使用します。

  • マージするフィールドをソートしてから、フィールドをマージします。

  • ユーザー定義関数 (UDF) を使用します。 UDFの詳細については、「MaxCompute UDF」をご参照ください。

複数の列のマージ

已开通

已开通

WM_CONCATおよびGROUP_CONCAT関数は、行をマージするために使用される関数です。 2つの関数は、異なるグループ内の複数の列の値をマージするために列をマージするために使用されるCONCAT関数またはCONCAT_WS関数で使用できます。

WM_CONCAT関数を使用すると、上記の表で説明した関数の機能に基づいて、次の要件を満たすことができます。

  • 要件1: 同じグループの価格列の値をマージします。 返される結果には重複する値が含まれます。

    SELECT name, wm_concat(',', price) AS price_new FROM price_total GROUP BY name;

    次の応答が返されます。

    +--------+-----------+
    | name   | price_new |
    +--------+-----------+
    | bag    | 50,100    |
    | noodle | 2,2,5     |
    | potato | 5,4       |
    | sugar  | 20,10,50  |
    +--------+-----------+
    
  • 要件2: 同じグループの価格列の値をマージします。 返された結果に重複する値は含まれません。

    SELECT name, wm_concat(distinct ',', price) AS price_new FROM price_total GROUP BY name;

    次の応答が返されます。

    +--------+-----------+
    | name   | price_new |
    +--------+-----------+
    | bag    | 100,50    |
    | noodle | 2,5       |
    | potato | 4,5       |
    | sugar  | 10,20,50  |
    +--------+-----------+
  • 要件3: 同じグループの価格列の値をマージして並べ替えます。 返される結果には重複する値が含まれます。

    • 方法 1:

      SELECT name, wm_concat(',', price) WITHIN GROUP (ORDER BY price desc) AS price_new 
      FROM (SELECT name, price FROM price_total) GROUP BY name;
    • 方法 2:

      SELECT name, wm_concat(',', price) AS price_new 
      FROM (SELECT name, price FROM price_total ORDER BY name, price desc LIMIT 100) GROUP BY name;
    • 次の応答が返されます。

      +--------+-----------+
      | name   | price_new |
      +--------+-----------+
      | bag    | 100,50    |
      | noodle | 5,2,2     |
      | potato | 5,4       |
      | sugar  | 50,20,10  |
      +--------+-----------+
  • 要件4: 同じグループの価格列の値をマージして並べ替えます。 返された結果に重複する値は含まれません。

    • 方法 1:

      SELECT name, wm_concat(',', price)  within GROUP (ORDER BY price asc)
      FROM (SELECT DISTINCT name, price FROM price_total) GROUP BY name;
    • 方法 2:

      SELECT name, wm_concat(',', price) AS price_new 
      FROM (SELECT DISTINCT name, price FROM price_total ORDER BY name, price asc LIMIT 100) GROUP BY name;
    • 次の応答が返されます。

      +--------+-----------+
      | name   | price_new |
      +--------+-----------+
      | bag    | 50,100    |
      | noodle | 2,5       |
      | potato | 4,5       |
      | sugar  | 10,20,50  |
      +--------+-----------+
  • 要件5: 同じグループの価格列の値とsaleid列の値をマージします。

    SELECT name, wm_concat(',', concat_ws(':',price,saleid)) AS price_new FROM price_total GROUP BY name;
    -- The preceding statement is equivalent to the following statement: 
    SELECT name, wm_concat(',', concat(price,':',saleid)) FROM price_total GROUP BY name;

    次の応答が返されます。

    +--------+-----------------+
    | name   | price_new       |
    +--------+-----------------+
    | bag    | 50:1,100:2      |
    | noodle | 2:4,2:5,5:1     |
    | potato | 5:6,4:3         |
    | sugar  | 20:3,10:4,50:7  |
    +--------+-----------------+

関連ドキュメント