- Kategorien:
Aggregationsfunktionen (Allgemein), Fensterfunktionen (Allgemein)
ANY_VALUE¶
Gibt einen beliebigen Wert des Ausdrucks aus der Gruppe zurück. Das Ergebnis ist nicht deterministisch.
Syntax¶
Aggregatfunktion
ANY_VALUE( [ DISTINCT ] <expr1> )
Fensterfunktionen
ANY_VALUE( [ DISTINCT ] <expr1> ) OVER ( [ PARTITION BY <expr2> ] )
Nutzungshinweise¶
Das Schlüsselwort DISTINCT kann bei dieser Funktion angegeben werden, hat jedoch keine Auswirkungen.
Bei Verwendung als Fensterfunktion:
Diese Funktion unterstützt nicht:
ORDER BY-Unterklausel in der OVER()-Klausel
Fensterrahmen
Verwenden von ANY_VALUE mit GROUP BY-Anweisungen¶
Mit ANY_VALUE kann die Leistung von GROUP BY-Anweisungen vereinfacht und optimiert werden. Ein häufiges Problem bei vielen Abfragen ist, dass das Ergebnis einer Abfrage mit einer GROUP BY-Klausel nur Ausdrücke enthalten kann, die in der GROUP BY-Klausel selbst verwendet werden, oder Ergebnisse von Aggregatfunktionen. Beispiel:
SELECT customer.id , customer.name , SUM(orders.value)
FROM customer
JOIN orders ON customer.id = orders.customer_id
GROUP BY customer.id , customer.name;
In dieser Abfrage muss das Attribut customer.name
in GROUP BY enthalten sein, um in das Ergebnis aufgenommen zu werden. Dies ist eigentlich nicht erforderlich (z. B. wenn bekannt ist, dass customer.id
eindeutig ist) und macht die Berechnung möglicherweise komplexer und langsamer. Eine weitere Option ist die Verwendung einer Aggregatfunktion. Beispiel:
SELECT customer.id , MIN(customer.name) , SUM(orders.value)
FROM customer
JOIN orders ON customer.id = orders.customer_id
GROUP BY customer.id;
Dies vereinfacht die GROUP BY-Klausel, erfordert jedoch weiterhin das Berechnen der MIN-Funktion, was zusätzliche Kosten verursacht.
Mit ANY_VALUE können Sie die folgende Abfrage ausführen:
SELECT customer.id , ANY_VALUE(customer.name) , SUM(orders.value)
FROM customer
JOIN orders ON customer.id = orders.customer_id
GROUP BY customer.id;