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関数は、行をマージするために使用される関数です。 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 | +--------+-----------------+
関連ドキュメント
MaxComputeにHive、MySQL、およびOracleの組み込み関数を実装する方法の詳細については、「MaxComputeの組み込み関数とHive、MySQL、およびOracleの組み込み関数の間のマッピング」をご参照ください。
MaxComputeが提供する組み込み関数がビジネス要件を満たさない場合は、UDFを開発できます。 UDFの詳細については、「概要」をご参照ください。