Catégories :

Fonctions d’agrégation (Général) , Fonctions de la fenêtre (Général)

ANY_VALUE

Renvoie une valeur de l’expression du groupe. Le résultat est non déterministe.

Syntaxe

Fonction d’agrégation

ANY_VALUE( [ DISTINCT ] <expr1> )

Fonction de fenêtre

ANY_VALUE( [ DISTINCT ] <expr1> ) OVER ( [ PARTITION BY <expr2> ] )

Notes sur l’utilisation

  • Le mot clé DISTINCT peut être spécifié pour cette fonction, mais il n’a aucun effet.

  • Lorsqu’il est utilisé comme une fonction de fenêtre :

    • Cette fonction ne prend pas en charge :

      • Sous-clause ORDER BY dans la clause OVER().

      • Cadres de fenêtre.

Utilisation de ANY_VALUE avec les instructions GROUP BY

ANY_VALUE peut simplifier et optimiser les performances des instructions GROUP BY. Un problème commun à de nombreuses requêtes est que le résultat d’une requête avec une clause GROUP BY ne peut contenir que des expressions utilisées dans la clause GROUP BY elle-même, ou des résultats de fonctions d’agrégat. Par exemple :

SELECT customer.id , customer.name , SUM(orders.value)
    FROM customer
    JOIN orders ON customer.id = orders.customer_id
    GROUP BY customer.id , customer.name;

Dans cette requête, l’attribut customer.name doit figurer dans le GROUP BY pour être inclus dans le résultat. Ceci est inutile (par exemple, lorsque customer.id est connu pour être unique) et rend le calcul éventuellement plus complexe et plus lent. Une autre option consiste à utiliser une fonction d’agrégat. Par exemple :

SELECT customer.id , MIN(customer.name) , SUM(orders.value)
    FROM customer
    JOIN orders ON customer.id = orders.customer_id
    GROUP BY customer.id;

Cela simplifie la clause GROUP BY, mais nécessite toujours le calcul de la fonction MIN, ce qui entraîne un coût supplémentaire.

Avec ANY_VALUE, vous pouvez exécuter la requête suivante :

SELECT customer.id , ANY_VALUE(customer.name) , SUM(orders.value)
    FROM customer
    JOIN orders ON customer.id = orders.customer_id
    GROUP BY customer.id;