Comment utiliser la fonction max_by en SQL pour simplifier vos requêtes

La fonction max_by en SQL, notamment dans BigQuery, permet de récupérer la valeur d’une colonne associée à la valeur maximale d’une autre. Un atout puissant et peu connu pour éviter les requêtes complexes avec row_number() ou jointures.

3 principaux points à retenir.

  • max_by() simplifie l’extraction d’une valeur liée à un maximum d’une autre colonne.
  • Cette fonction évite d’utiliser des techniques complexes comme les fenêtres row_number().
  • Idéale pour retrouver la dernière commande, le dernier commentaire ou événement utilisateur.

Qu’est-ce que la fonction max_by et à quoi sert-elle

La fonction max_by est une étoile montante dans le firmament des fonctions d’agrégation SQL, particulièrement dans BigQuery et quelques autres systèmes de gestion de bases de données modernes. En gros, elle vous permet de grappiller la valeur d’une colonne en fonction de la valeur maximale d’une autre colonne. Ça parle ? Pas encore ? Laissez-moi vous éclairer avec des exemples concrets.

Imaginez que vous gériez une boutique en ligne. Vous avez un tableau des commandes où chaque ligne représente une commande avec un identifiant d’utilisateur et une valeur de commande. Si vous voulez récupérer le dernier ID de commande d’un utilisateur spécifique, la fonction max_by vous rend un immense service.

Comme on dit à Brive, un bon plan de marquage vaut mieux qu’un bon reporting ! Si besoin, consultez moi - faites appel à un super consultant en tracking client et server side.


SELECT user_id, MAX_BY(order_id, order_date) AS last_order_id
FROM orders
GROUP BY user_id;

Dans cet exemple, vous obtenez le dernier ID de commande en fonction de la date de commande. Pas besoin de vous embêter avec des ROW_NUMBER() ou des sous-requêtes compliquées. Fini les labyrinthes SQL.

Un autre cas d’usage ? Pensez à un système de suivi d’événements. Si vous souhaitez savoir quel est le dernier événement enregistré pour chaque utilisateur, encore une fois, max_by est votre allié :


SELECT user_id, MAX_BY(event_name, event_time) AS latest_event
FROM events
GROUP BY user_id;

Au lieu de jongler avec des requêtes imbriquées, cette fonction vous allège la tâche. Vous récupérez directement ce qu’il vous faut sans faire une danse du feu avec votre code SQL.

En résumé, la syntaxe générique de max_by est facile à mémoriser : max_by(valeur_à_récupérer, colonne_de_comparaison). C’est une façon élégante de corriger un problème majeur : la complexité des requêtes qui était souvent un casse-tête. Grâce à elle, vous gagnez du temps et de la clarté dans vos travaux de requêtes. Si vous cherchez à pousser encore plus loin vos compétences en SQL, ne manquez pas de consulter cet article.

Comment utiliser max_by dans vos requêtes SQL concrètement

La fonction max_by de SQL est un véritable atout pour simplifier vos requêtes, notamment lorsque vous travaillez avec des ensembles de données volumineux. C’est comme avoir un super pouvoir lorsque vous devez extraire les dernières informations parmi de multiples enregistrements. Prenons un exemple concret pour illustrer son utilisation : disons que vous devez récupérer le dernier order_id pour chaque user_id dans une table orders.

Voici comment vous pourriez écrire cette requête en utilisant max_by :

SELECT user_id, MAX_BY(order_id, ordered_at) as last_order_id
FROM orders
GROUP BY user_id;

Facile, non ? Avec cette simple requête, vous pouvez obtenir le dernier order_id pour chaque utilisateur, basé sur la colonne ordered_at. Cela vous évite d’avoir à écrire plusieurs sous-requêtes ou de combiner des jointures alambiquées, ce qui peut devenir vite opaque et difficile à lire.

Les cas d’usage de max_by sont nombreux et peuvent transformer la manière dont votre équipe marketing ou produit interagit avec les données. Par exemple :

  • Récupérer les dernières données temporelles : Les analystes peuvent facilement extraire les dernières interactions ou transactions, optimisant ainsi la réactivité des campagnes.
  • Suivi d’événements récents : Les équipes produit peuvent suivre les fonctionnalités les plus récentes utilisées par les utilisateurs, permettant un développement plus ciblé.
  • Interactions utilisateur : Identifier les dernières actions effectuées par un utilisateur peut améliorer l’expérience client avec des recommandations pertinentes.

La fonction max_by est particulièrement appréciée pour sa simplicité, surtout comparée à des alternatives comme les sous-requêtes, qui peuvent alourdir la lisibilité du code. Cependant, restez vigilant face à certaines limites. Par exemple, pensez à gérer les valeurs NULL, car elles peuvent influencer vos résultats, notamment si des enregistrements manquent dans votre jeu de données. De plus, l’utilisation de max_by peut différer d’un SGBD à l’autre, alors assurez-vous qu’il est pris en charge par votre système.

Pour approfondir vos connaissances sur le fonctionnement de GROUP BY en SQL, vous pouvez consulter cet article.

Quels sont les avantages et limites de max_by face à row_number

La fonction max_by est un véritable atout dans l’arsenal des développeurs SQL, surtout quand il s’agit de simplifier les requêtes. Ses principaux avantages résident dans sa simplicité, sa rapidité de développement et la lisibilité du code. Avec max_by, vous pouvez extraire rapidement la valeur maximale d’un champ en relation avec un autre, sans avoir besoin de fausse complexité. Cela permet non seulement de gagner du temps mais aussi de réduire les erreurs potentielles que l’on pourrait rencontrer dans des requêtes trop verbeuses.

En revanche, lorsque l’on compare max_by à ROW_NUMBER(), une autre fonction courante, on constate que ROW_NUMBER() offre une flexibilité supérieure, surtout pour des scénarios de filtrage complexe ou multi-critères. Par exemple, si vous souhaitez numéroter les lignes après un groupement, ROW_NUMBER() devient essentiel. Cependant, cette puissance vient au prix de la lisibilité et parfois des performances. Une requête utilisant ROW_NUMBER() peut sembler encombrée et consommer plus de ressources, surtout si vous ne vous concentrez que sur l’extraction d’une valeur maximale simple.

Pour illustrer cela, prenons un exemple concret. Supposons que vous ayez une table de ventes, et que vous vouliez récupérer le prix le plus élevé pour chaque produit. Avec max_by, la requête est claire et concise :

SELECT product_id, max_by(price, sale_date) as max_price
FROM sales
GROUP BY product_id;

Tandis qu’avec ROW_NUMBER(), cela pourrait ressembler à :

WITH RankedSales AS (
    SELECT product_id, price, ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY sale_date DESC) as rn
    FROM sales
)
SELECT product_id, price
FROM RankedSales
WHERE rn = 1;

Dans ce cas, max_by est plus approprié en termes de simplicité et de rapidité. Cependant, si vous avez besoin d’un classement plus détaillé sur plusieurs critères, ROW_NUMBER() est le bon choix.

Fonction Usage Lisibilité Performance Complexité
max_by Simplification d’extraction de valeur maximale Élevée Optimale Basse
ROW_NUMBER() Filtrage avancé, multi-critères Moyenne Variable Élevée

Faut-il adopter max_by pour optimiser vos requêtes SQL dès aujourd’hui ?

La fonction max_by est une pépite pour qui manipule beaucoup de données SQL, car elle simplifie drastiquement l’extraction d’une valeur associée à un maximum sans lourdeurs de row_number ou jointures encombrantes. Elle est particulièrement utile pour récupérer rapidement des informations temporelles ou les dernières interactions utilisateurs. Bien sûr, son usage est à privilégier quand vos besoins sont simples, laissant room à row_number pour des scénarios avancés. En bref, intégrer max_by dans votre boîte à outils SQL vous fera gagner du temps et du code propre, deux biens précieux en data engineering et analytics.

FAQ

Qu’est-ce que la fonction max_by en SQL ?

max_by est une fonction SQL d’agrégation qui renvoie la valeur d’une colonne liée à la valeur maximale d’une autre colonne, facilitant ainsi la récupération de la donnée associée au maximum.

Dans quels cas utiliser max_by plutôt que row_number ?

max_by est préférable pour des besoins simples comme récupérer la dernière commande ou le dernier événement. row_number reste nécessaire quand on doit gérer des critères multiples ou des filtrages complexes.

Comment écrire une requête avec max_by ?

Une requête type : SELECT user_id, max_by(order_id, ordered_at) FROM orders GROUP BY user_id, pour obtenir l’ID de la dernière commande par utilisateur.

Est-ce que max_by est disponible dans tous les systèmes de gestion SQL ?

max_by est supportée dans BigQuery, Snowflake, et certains autres SGBD modernes, mais pas dans tous. Vérifiez la documentation de votre solution SQL.

Quels sont les pièges à éviter avec max_by ?

Attention aux valeurs NULL dans les colonnes comparées, et à bien choisir les colonnes en entrée pour éviter des résultats erronés. max_by ne remplace pas toutes les logiques complexes de tri ou filtrage.

 

A propos de l’auteur

Je suis Franck Scandolera, consultant en web analytics et data engineering depuis plus d’une décennie. J’accompagne entreprises et professionnels dans l’optimisation de leurs requêtes SQL et infrastructures BigQuery, en privilégiant efficacité, conformité RGPD et automatisation. Formateur expérimenté, je transmets les meilleures pratiques pour exploiter les fonctions avancées comme max_by et rendre la donnée accessible et utile.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut