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 !