SQL - Comment utiliser ARRAY_CONCAT_AGG() ?

SQL - Comment utiliser ARRAY_CONCAT_AGG() ?

Date de sortie
September 10, 2024
Auteur
Bertrand Fabre
“Sur notre site web, l’utilisateur a la possibilité de passer une commande et d’y ajouter encore des articles pendant 2h. La difficulté niveau data c’est que cela génère plusieurs lignes dans les tables pour la même commande avec à chaque fois un tableau des différents articles ajoutés. Je fais comment pour regrouper ces deux lignes ?

Pas évident ce cas. Néanmoins, BigQuery nous propose une fonction toute faite pour regrouper deux tableaux ou ARRAYs : ARRAY_CONCAT_AGG().

Allons vite dans le vif du sujet et reprenons la problématique initiale avec une visualisation des données :

WITH cte_orders AS (
  SELECT 1 AS order_id, ['product1', 'product2'] AS products, UNION ALL
  SELECT 1 AS order_id, ['product3'],                         UNION ALL
  SELECT 2 AS order_id, ['product4', 'product5'],             UNION ALL
  SELECT 2 AS order_id, ['product6'],                         UNION ALL
  SELECT 3 AS order_id, ['product7'] 
)
SELECT * /* c'est mal, je sais */
FROM cte_orders;

Le résultat :

order_id
products
1
product1
product2
1
product3
2
product4
product5
2
product6
3
product7

On voudrait donc regrouper les produits d’une même commande.

Voici l’approche :

WITH cte_orders AS (
  SELECT 1 AS order_id, ['product1', 'product2'] AS products, UNION ALL
  SELECT 1 AS order_id, ['product3'],                         UNION ALL
  SELECT 2 AS order_id, ['product4', 'product5'],             UNION ALL
  SELECT 2 AS order_id, ['product6'],                         UNION ALL
  SELECT 3 AS order_id, ['product7']                         
)
SELECT
  order_id,
  ARRAY_CONCAT_AGG(products) AS products
FROM cte_orders
GROUP BY order_id;

Le résultat :

order_id
products
1
product1
product2
product3
2
product4
product5
product6
3
product7

A noter, que pour faire l’agrégation, il faut classiquement penser à utiliser le GROUP BY sur la dimension à agréger.

Merci de votre lecture !