Kategorien:

Aggregatfunktionen (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 mit GROUP BY-Anweisungen

ANY_VALUE kann verwendet werden, um die Leistung von GROUP BY-Anweisungen zu vereinfachen und zu optimieren. 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;

Beispiele

Einrichtung:

CREATE OR REPLACE TABLE example_any(k int, d decimal(10,5));
INSERT INTO example_any VALUES (1, 1), (1, 5), (1, 10), (2, 2), (2, NULL), (2, 20);

SELECT * FROM example_any;

+---+----------+
| K |        D |
|---+----------|
| 1 |  1.00000 |
| 1 |  5.00000 |
| 1 | 10.00000 |
| 2 |  2.00000 |
| 2 |     NULL |
| 2 | 20.00000 |
+---+----------+

Zurückgeben eines beliebigen Werts aus example_any, gruppiert nach k:

SELECT k, ANY_VALUE(d) FROM example_any GROUP BY k;

+---+--------------+
| K | ANY_VALUE(D) |
|---+--------------|
| 1 |      1.00000 |
| 2 |      2.00000 |
+---+--------------+

Dieses Beispiel ist identisch mit dem vorherigen Beispiel und veranschaulicht den Nicht-Determinismus der Ergebnisse:

SELECT k, ANY_VALUE(d) FROM example_any GROUP BY k;

+---+--------------+
| K | ANY_VALUE(D) |
|---+--------------|
| 1 |      5.00000 |
| 2 |     20.00000 |
+---+--------------+