La fonction MAX_BY en SQL permet d’extraire facilement une valeur associée au maximum d’une autre colonne, simplifiant grandement certaines requêtes en BigQuery. Utile notamment pour obtenir la dernière commande d’un utilisateur sans complexité excessive (source : Google BigQuery documentation).
3 principaux points à retenir.
- MAX_BY facilite la récupération de valeurs liées au maximum dans une autre colonne.
- Elle simplifie les requêtes souvent complexes avec window functions comme ROW_NUMBER().
- Indispensable pour agréger rapidement des données chronologiques ou événementielles en SQL.
Qu’est-ce que la fonction MAX_BY et pourquoi l’utiliser
La fonction MAX_BY dans BigQuery est un vrai bijou pour ceux qui travaillent avec des ensembles de données. Elle simplifie la manière dont on peut tirer parti des agrégations, notamment en vous permettant de récupérer une valeur d’une colonne correspondant à la valeur maximale d’une autre. Autrement dit, si vous voulez savoir quel utilisateur a passé la commande la plus récente ou quelle vente est la plus élevée pour un produit, MAX_BY le fait facilement, sans avoir à plonger dans des constructions SQL complexes.
Quand on parle de constructions lourdes, pensez à ROW_NUMBER() ou des sous-requêtes. Ces méthodes peuvent fonctionner, mais elles alourdissent la requête et nuisent à sa lisibilité. Avec MAX_BY, la simplicité est de mise. Prenons un exemple pour illustrer : Imaginez que vous avez une table d’utilisateurs, avec deux colonnes clés : order_id et ordered_at. Si vous souhaitez trouver l’order_id pour chaque utilisateur, associé à leur commande la plus récente, votre requête serait aussi simple que :
SELECT user_id, MAX_BY(order_id, ordered_at) as latest_order
FROM orders
GROUP BY user_id;
Dans cet exemple, pour chaque user_id, vous obtenez l’order_id associé à la date de commande maximale dans la colonne ordered_at. Clairement, ça réduit le besoin de multiples niveaux de logique.
La fonction MAX_BY est unique à BigQuery, et c’est là qu’elle s’illustre vraiment. Vous ne la trouverez pas dans tous les autres moteurs SQL sous la même forme. Par exemple, dans PostgreSQL, vous devrez jongler avec des CTE ou des jointures pour obtenir un effet similaire, rendant le code plus lourd. En gros, si vous êtes dans un environnement BigQuery et que vous manipulez des données où la valeur associée à la fréquence ou au maximum devrait être prise en compte, MAX_BY est quasiment incontournable.
Pour en savoir plus sur les fonctions d’agrégation dans BigQuery, vous pouvez consulter la documentation officielle.
Comment utiliser MAX_BY dans des requêtes pratiques
Pour exploiter la fonction MAX_BY dans des requêtes concrètes, examinons quelques cas d’utilisation. Commençons par récupérer la dernière commande par utilisateur. Supposons que nous avons une table commandes avec les colonnes utilisateur_id, date_commande et montant :
SELECT
utilisateur_id,
MAX_BY(date_commande, date_commande) AS derniere_commande,
MAX_BY(montant, date_commande) AS montant_derniere_commande
FROM
commandes
GROUP BY
utilisateur_id;
Ici, nous groupions par utilisateur_id pour obtenir les dernières commandes des clients, tout en récupérant le montant associé à cette commande. Cela permet d’éviter des sous-requêtes fastidieuses ou des requêtes de type WINDOW qui alourdissent souvent le code SQL.
Un autre exemple courant consiste à extraire le dernier commentaire d’utilisateurs dans une table commentaires avec des colonnes utilisateur_id, date_commentaire et texte_commentaire. Voici comment faire :
SELECT
utilisateur_id,
MAX_BY(text_commentaire, date_commentaire) AS dernier_commentaire
FROM
commentaires
GROUP BY
utilisateur_id;
Dans cet exemple, la fonction MAX_BY sélectionne le texte du commentaire le plus récent pour chaque utilisateur. Cela simplifie le code à l’extrême, tout en étant performant.
Cependant, une précaution s’impose. Si plusieurs lignes partagent la valeur maximale, MAX_BY renverra un résultat non déterminé. Cela peut fausser les données lorsque plusieurs enregistrements ont la même date ou le même montant maximum. Pour atténuer ce risque, il peut être judicieux de rajouter un champ supplémentaire comme une colonne d’ID unique pour assurer la cohérence.
Pour des scénarios plus complexes où vous souhaitez tirer des valeurs maximales à partir de plusieurs colonnes, vous pourriez recourir à une requête combinée :
SELECT
utilisateur_id,
MAX_BY((date_commande, montant), date_commande) AS derniere_commande_details
FROM
commandes
GROUP BY
utilisateur_id;
Dans cette approche, vous regroupez les données tout en récupérant le couple de date et de montant associé, tout en préservant la simplicité du code. En résumé, la fonction MAX_BY vous offre une flexibilité incroyable tout en maintenant l’efficacité, mais n’oubliez pas de toujours vérifier les conditions de vos données. Pour plus de détails sur les meilleures pratiques, vous pouvez consulter ce lien.
Quels avantages MAX_BY offre-t-elle face aux alternatives SQL
Lorsque l’on compare la fonction MAX_BY de BigQuery aux méthodes classiques telles que ROW_NUMBER() avec partition et ORDER BY, ou l’utilisation de GROUP BY avec sous-requêtes, plusieurs dimensions sont à considérer : simplicité, lisibilité, performance et maintenance. Alors, pourquoi se soucier de MAX_BY ? Voici une analyse qui devrait éclairer votre choix.
- Simplicité : MAX_BY est direct. Pas besoin d’écrire des sous-requêtes compliquées ou de gérer des partitions. D’un simple coup, vous spécifiez la colonne de valeur et la colonne de tri. Par exemple :
SELECT MAX_BY(column_value, sort_column) AS max_value
FROM my_table;
- À l’opposé, avec ROW_NUMBER(), vous devez d’abord définir la partition, puis appliquer le rang. Cela complique la requête sans réel besoin.
- Lisibilité : MAX_BY rend votre intention claire. Les autres méthodes peuvent devenir obscures, surtout pour ceux qui lisent votre code. Le besoin de suivre plusieurs niveaux de requêtes et de spécifier des critères augmente la charge cognitive.
- Performance : Comme MAX_BY s’exécute en un seul passage, la performance est souvent meilleure, surtout sur des ensembles de données volumineux. Avec ROW_NUMBER() et GROUP BY, il y a des scans supplémentaires, ce qui entraîne un coût en temps d’exécution.
- Maintenance : Les requêtes MAX_BY sont plus faciles à maintenir. Si vous devez changer la logique, vous intervenez à un seul endroit. Avec la logique classique, des modifications peuvent entraîner des cascades de changements.
Voici un tableau comparatif pour visualiser ces notions :
| Méthode | Simplicité | Lisibilité | Performance | Maintenance |
|---|---|---|---|---|
| MAX_BY | Élevée | Élevée | Élevée | Élevée |
| ROW_NUMBER() | Moyenne | Moyenne | Basse | Moyenne |
| GROUP BY + sous-requête | Basse | Basse | Basse | Basse |
En somme, MAX_BY est un choix gagnant pour les analystes data et développeurs SQL qui cherchent à optimiser leur code. Non seulement vous gagnerez en efficacité, mais également en clarté, ce qui est crucial dans des environnements de travail collaboratifs.
Comment intégrer MAX_BY dans vos projets et workflows data
Pour intégrer MAX_BY dans vos projets et workflows data, il faut comprendre comment cette fonction peut transformer vos opérations quotidiennes. Dans les pipelines de données, MAX_BY permet d’extraire rapidement des valeurs biasées par un critère, simplifiant ainsi la gestion des données. Par exemple, au lieu de devoir trier manuellement les données pour trouver le salaire le plus élevé par département, vous pouvez le faire en une seule ligne de code. Le gain de temps est énorme, et la lisibilité de votre requête augmente, réduisant ainsi le risque d’erreurs.
Dans des dashboards, l’intégration de MAX_BY améliore la clarté des rapports. Imaginez un tableau de bord où vous analysez les ventes par région. Loin d’utiliser des méthodes compliquées, une simple application de MAX_BY vous permet de mettre en avant le produit le plus vendu par région d’un seul coup d’œil. Cela permet aux décideurs d’avoir une vue d’ensemble rapide, sans se perdre dans des chiffres obscurs.
- Utilisation dans des rapports business: Par exemple, un rapport de ventes peut montrer quel a été le meilleur vendeur d’un produit pour une période donnée avec simplement:
SELECT
department,
MAX_BY(sales_person, total_sales) AS top_seller
FROM
sales_data
GROUP BY
department;
Quant à la structuration des données, elle est primordiale. Pour tirer le meilleur parti de MAX_BY, assurez-vous que vos données sont bien normalisées. Une mauvaise structuration compliquerait l’utilisation de cette fonction et limiterait vos options d’analyse.
Enfin, pour un script SQL typique de transformation ou de reporting :
SELECT
user_id,
MAX_BY(order_value, order_date) AS latest_order
FROM
orders
GROUP BY
user_id;
Ce type d’intégration fait gagner un temps précieux et enrichit la lisibilité de votre code, ce qui est essentiel pour le travail d’équipe en data engineering. Si vous cherchez des exemples supplémentaires et des conseils, n’hésitez pas à consulter cet article ici.
Pourquoi MAX_BY devrait devenir votre allié SQL incontournable
La fonction MAX_BY est une véritable pépite pour tous ceux qui manipulent des données temporelles ou ordonnées en SQL. Elle réduit la complexité et le volume de code, rendant les requêtes plus lisibles et souvent plus performantes. Que ce soit pour récupérer la dernière commande, le dernier événement ou tout autre élément lié à un maximum, MAX_BY simplifie l’agrégation de données. Son adoption est un vrai coup de boost pour les analystes et développeurs qui veulent un SQL affuté et pragmatique, sans perdre de temps à gérer des constructions lourdes et difficiles à maintenir.
FAQ
Qu’est-ce que la fonction MAX_BY en SQL ?
Dans quels cas utiliser MAX_BY plutôt que ROW_NUMBER() ?
Quels sont les moteurs SQL supportant MAX_BY ?
Peut-on utiliser MAX_BY avec plusieurs colonnes ?
MAX_BY améliore-t-elle la performance des requêtes ?
A propos de l’auteur
Franck Scandolera, fort de plus de 10 ans d’expérience en data engineering et analytics, accompagne des entreprises dans la maîtrise de leurs outils SQL et BigQuery. Responsable de l’agence webAnalyste et formateur expert, il partage une approche pragmatique et orientée business, avec un focus sur l’automatisation et la simplification des requêtes complexes. Son expertise technique et pédagogique vous guide pour exploiter pleinement les fonctions avancées comme MAX_BY dans vos projets data.
⭐ Analytics engineer, Data Analyst et Automatisation IA indépendant ⭐
- Ref clients : Logis Hôtel, Yelloh Village, BazarChic, Fédération Football Français, Texdecor…
Mon terrain de jeu :
- Data Analyst & Analytics engineering : tracking avancé (GTM server, e-commerce, CAPI, RGPD), entrepôt de données (BigQuery, Snowflake, PostgreSQL, ClickHouse), modèles (Airflow, dbt, Dataform), dashboards décisionnels (Looker, Power BI, Metabase, SQL, Python).
- Automatisation IA des taches Data, Marketing, RH, compta etc : conception de workflows intelligents robustes (n8n, App Script, scraping) connectés aux API de vos outils et LLM (OpenAI, Mistral, Claude…).
- Engineering IA pour créer des applications et agent IA sur mesure : intégration de LLM (OpenAI, Mistral…), RAG, assistants métier, génération de documents complexes, APIs, backends Node.js/Python.






