A GROUP_CONCAT é uma função de agregação do MySQL que concatena valores de coluna de várias linhas em cada grupo gerado por GROUP BY, formando uma única string. Use essa função para combinar vários registros de dados em um só. No MaxCompute, utilize a função WM_CONCAT para obter o mesmo resultado da GROUP_CONCAT.
Exemplo
Uma tabela chamada price_total contém as colunas name, price e saleid com os seguintes dados:
+--------+------------+------------+
| 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 |
+--------+------------+------------+
Neste exemplo, todos os produtos são agrupados pelo nome do produto (coluna name). Utilize a função GROUP_CONCAT no MySQL para atender aos seguintes requisitos:
-
Requisito 1: Mesclar os valores na coluna price do mesmo grupo. Os resultados retornados contêm valores duplicados. Instrução de exemplo:
SELECT name, group_concat(price) FROM price_total GROUP BY name; -
Requisito 2: Mesclar os valores na coluna price do mesmo grupo. Os resultados retornados não contêm valores duplicados. Instrução de exemplo:
SELECT name, group_concat(distinct price) FROM price_total GROUP BY name; -
Requisito 3: Mesclar e ordenar os valores na coluna price do mesmo grupo. Os resultados retornados contêm valores duplicados. Instrução de exemplo:
SELECT name, group_concat(price ORDER BY price desc) FROM price_total GROUP BY name; -
Requisito 4: Mesclar e ordenar os valores na coluna price do mesmo grupo. Os resultados retornados não contêm valores duplicados. Instrução de exemplo:
SELECT name, group_concat(distinct price ORDER BY price desc) FROM price_total GROUP BY name; -
Requisito 5: Mesclar os valores das colunas price e saleid do mesmo grupo. Instrução de exemplo:
SELECT name, group_concat(concat_ws(':', price, saleid)) FROM price_total GROUP BY name;
Solução
O MaxCompute não oferece suporte à função GROUP_CONCAT. Para atender aos requisitos deste exemplo, use a função WM_CONCAT.
Observe que a função WM_CONCAT não é equivalente à função GROUP_CONCAT. A tabela a seguir descreve as capacidades dessas funções.
|
Capacidade |
WM_CONCAT |
GROUP_CONCAT |
Descrição |
|
Deduplicação com DISTINCT |
|
|
Nenhuma. |
|
Delimitador |
|
|
Use um delimitador para concatenar os valores a serem mesclados. Considere os pontos a seguir ao incluir delimitadores nas funções WM_CONCAT e GROUP_CONCAT:
|
|
Ordenação |
|
|
Para ordenar valores, adote um dos métodos abaixo:
|
|
Mesclagem de várias colunas |
|
|
As funções WM_CONCAT e GROUP_CONCAT servem para mesclar linhas. Combine-as com a função CONCAT ou CONCAT_WS, usadas para mesclar colunas, permitindo unir valores de múltiplas colunas em diferentes grupos. |
Com base nas capacidades descritas na tabela anterior, utilize a função WM_CONCAT para atender aos seguintes requisitos:
-
Requisito 1: Mesclar os valores na coluna price do mesmo grupo. Os resultados retornados contêm valores duplicados.
SELECT name, wm_concat(',', price) AS price_new FROM price_total GROUP BY name;Resultado retornado:
+--------+-----------+ | name | price_new | +--------+-----------+ | bag | 50,100 | | noodle | 2,2,5 | | potato | 5,4 | | sugar | 20,10,50 | +--------+-----------+ -
Requisito 2: Mesclar os valores na coluna price do mesmo grupo. Os resultados retornados não contêm valores duplicados.
SELECT name, wm_concat(distinct ',', price) AS price_new FROM price_total GROUP BY name;Resultado retornado:
+--------+-----------+ | name | price_new | +--------+-----------+ | bag | 100,50 | | noodle | 2,5 | | potato | 4,5 | | sugar | 10,20,50 | +--------+-----------+ -
Requisito 3: Mesclar e ordenar os valores na coluna price do mesmo grupo. Os resultados retornados contêm valores duplicados.
-
Método 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; -
Método 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; -
Resultado retornado:
+--------+-----------+ | name | price_new | +--------+-----------+ | bag | 100,50 | | noodle | 5,2,2 | | potato | 5,4 | | sugar | 50,20,10 | +--------+-----------+
-
-
Requisito 4: Mesclar e ordenar os valores na coluna price do mesmo grupo. Os resultados retornados não contêm valores duplicados.
-
Método 1:
SELECT name, wm_concat(',', price) within GROUP (ORDER BY price asc) FROM (SELECT DISTINCT name, price FROM price_total) GROUP BY name; -
Método 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; -
Resultado retornado:
+--------+-----------+ | name | price_new | +--------+-----------+ | bag | 50,100 | | noodle | 2,5 | | potato | 4,5 | | sugar | 10,20,50 | +--------+-----------+
-
-
Requisito 5: Mesclar os valores das colunas price e saleid do mesmo grupo.
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;Resultado retornado:
+--------+-----------------+ | 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 | +--------+-----------------+
Referências
Para saber mais sobre como implementar funções internas do Hive, MySQL e Oracle no MaxCompute, consulte Mapeamentos entre funções internas do MaxCompute e funções internas do Hive, MySQL e Oracle.
Caso as funções internas do MaxCompute não atendam às suas necessidades de negócio, desenvolva UDFs. Para mais detalhes sobre UDFs, consulte Visão geral.