Tous les produits
Search
Centre de documentation

MaxCompute:Implémenter les fonctionnalités de la fonction GROUP_CONCAT

Dernière mise à jour :Aug 10, 2026

GROUP_CONCAT est une fonction d'agrégation fournie par MySQL. Elle concatène les valeurs de colonne de plusieurs lignes au sein de chaque groupe généré par l'instruction GROUP BY en une seule chaîne. Utilisez cette fonction pour combiner plusieurs enregistrements de données en un seul. Dans MaxCompute, utilisez la fonction WM_CONCAT pour obtenir le même résultat que GROUP_CONCAT.

Exemple

Une table nommée price_total contient les colonnes suivantes : name, price et saleid. La table contient les données ci-dessous :

+--------+------------+------------+
| 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          |
+--------+------------+------------+

Dans cet exemple, les produits sont regroupés par nom (colonne name de la table). Utilisez la fonction GROUP_CONCAT dans MySQL pour répondre aux exigences suivantes :

  • Exigence 1 : fusionner les valeurs de la colonne price d'un même groupe. Les résultats renvoyés contiennent des doublons. Exemple d'instruction :

    SELECT name, group_concat(price) FROM price_total GROUP BY name;
  • Exigence 2 : fusionner les valeurs de la colonne price d'un même groupe. Les résultats renvoyés ne contiennent pas de doublons. Exemple d'instruction :

    SELECT name, group_concat(distinct price) FROM price_total GROUP BY name;
  • Exigence 3 : fusionner et trier les valeurs de la colonne price d'un même groupe. Les résultats renvoyés contiennent des doublons. Exemple d'instruction :

    SELECT name, group_concat(price ORDER BY price desc) FROM price_total GROUP BY name;
  • Exigence 4 : fusionner et trier les valeurs de la colonne price d'un même groupe. Les résultats renvoyés ne contiennent pas de doublons. Exemple d'instruction :

    SELECT name, group_concat(distinct price ORDER BY price desc) FROM price_total GROUP BY name;
  • Exigence 5 : fusionner les valeurs de la colonne price et celles de la colonne saleid d'un même groupe. Exemple d'instruction :

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

Solution

MaxCompute ne prend pas en charge la fonction GROUP_CONCAT. Utilisez la fonction WM_CONCAT pour répondre aux exigences de cet exemple.

Notez que la fonction WM_CONCAT n'est pas équivalente à la fonction GROUP_CONCAT. Le tableau suivant décrit les capacités de ces fonctions.

Fonctionnalité

WM_CONCAT

GROUP_CONCAT

Description

Déduplication avec DISTINCT

已开通

已开通

Aucune.

Délimiteur

已开通

已开通

Un délimiteur permet de concaténer les valeurs à fusionner. Tenez compte des points suivants lors de l'inclusion de délimiteurs dans les fonctions WM_CONCAT et GROUP_CONCAT :

  • Les délimiteurs sont obligatoires avec la fonction WM_CONCAT.

  • Les délimiteurs sont facultatifs avec la fonction GROUP_CONCAT. S'ils sont omis, des virgules (,) servent de délimiteurs.

Tri

已开通

已开通

Pour trier les valeurs, procédez comme suit :

  • Triez les champs à fusionner, puis fusionnez-les.

  • Utilisez des fonctions définies par l'utilisateur (UDF). Pour plus d'informations sur les UDF, consultez MaxCompute UDF.

Fusion de plusieurs colonnes

已开通

已开通

Les fonctions WM_CONCAT et GROUP_CONCAT permettent de fusionner des lignes. Combinez ces deux fonctions avec la fonction CONCAT ou la fonction CONCAT_WS, qui servent à fusionner des colonnes, afin de fusionner les valeurs de plusieurs colonnes dans différents groupes.

Utilisez la fonction WM_CONCAT pour répondre aux exigences suivantes, en vous basant sur les capacités décrites dans le tableau précédent :

  • Exigence 1 : fusionner les valeurs de la colonne price d'un même groupe. Les résultats renvoyés contiennent des doublons.

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

    Le résultat suivant est renvoyé :

    +--------+-----------+
    | name   | price_new |
    +--------+-----------+
    | bag    | 50,100    |
    | noodle | 2,2,5     |
    | potato | 5,4       |
    | sugar  | 20,10,50  |
    +--------+-----------+
    
  • Exigence 2 : fusionner les valeurs de la colonne price d'un même groupe. Les résultats renvoyés ne contiennent pas de doublons.

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

    Le résultat suivant est renvoyé :

    +--------+-----------+
    | name   | price_new |
    +--------+-----------+
    | bag    | 100,50    |
    | noodle | 2,5       |
    | potato | 4,5       |
    | sugar  | 10,20,50  |
    +--------+-----------+
  • Exigence 3 : fusionner et trier les valeurs de la colonne price d'un même groupe. Les résultats renvoyés contiennent des doublons.

    • Méthode 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éthode 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;
    • Le résultat suivant est renvoyé :

      +--------+-----------+
      | name   | price_new |
      +--------+-----------+
      | bag    | 100,50    |
      | noodle | 5,2,2     |
      | potato | 5,4       |
      | sugar  | 50,20,10  |
      +--------+-----------+
  • Exigence 4 : fusionner et trier les valeurs de la colonne price d'un même groupe. Les résultats renvoyés ne contiennent pas de doublons.

    • Méthode 1 :

      SELECT name, wm_concat(',', price)  within GROUP (ORDER BY price asc)
      FROM (SELECT DISTINCT name, price FROM price_total) GROUP BY name;
    • Méthode 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;
    • Le résultat suivant est renvoyé :

      +--------+-----------+
      | name   | price_new |
      +--------+-----------+
      | bag    | 50,100    |
      | noodle | 2,5       |
      | potato | 4,5       |
      | sugar  | 10,20,50  |
      +--------+-----------+
  • Exigence 5 : fusionner les valeurs de la colonne price et celles de la colonne saleid d'un même groupe.

    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;

    Le résultat suivant est renvoyé :

    +--------+-----------------+
    | 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  |
    +--------+-----------------+

Références