Analysefunktionen berechnen einen Aggregatwert basierend auf einer Gruppe von Zeilen. Sie unterscheiden sich von Aggregatfunktionen dadurch, dass sie für jede Gruppe mehrere Zeilen zurückgeben. Die Gruppe von Zeilen wird als Fenster bezeichnet und durch analytic_clause
definiert. Für jede Zeile wird ein Schiebefenster von Zeilen definiert. Das Fenster bestimmt den Zeilenbereich, der zum Ausführen der Berechnungen für die aktuelle Zeile verwendet wird. Fenstergrößen können entweder auf einer physischen Anzahl von Zeilen oder einem logischen Intervall wie der Zeit basieren.
Analysefunktionen sind die letzten Operationen, die in einer Abfrage ausgeführt werden, mit Ausnahme der letzten ORDER
BY
-Klausel. Alle Verknüpfungen und alle WHERE
GROUP
BY
und HAVING
Klauseln werden abgeschlossen, bevor die Analysefunktionen verarbeitet werden. Daher können Analysefunktionen nur in der select-Liste oder ORDER
BY
-Klausel angezeigt werden.
Analysefunktionen werden häufig verwendet, um kumulative, bewegliche, zentrierte und Berichtsaggregate zu berechnen.
analytic_function::=
Beschreibung der Abbildung „analytic_function.gif“
analytic_clause::=
Beschreibung der Abbildung „analytic_clause.gif“
query_partition_clause::=
Beschreibung der Abbildung „query_partition_clause.gif“
order_by_clause::=
Beschreibung der Abbildung „order_by_clause.gif“
windowing_clause ::=
Beschreibung der Abbildung „windowing_clause.gif“
Die Semantik dieser Syntax wird in den folgenden Abschnitten erläutert.
analytic_function
Geben Sie den Namen einer Analysefunktion an (siehe Auflistung der Analysefunktionen im Anschluss an diese Semantikdiskussion).
Argumente
Analysefunktionen benötigen 0 bis 3 Argumente. Die Argumente können beliebige numerische Datentypen oder nicht-numerische Datentypen sein, die implizit in einen numerischen Datentyp konvertiert werden können. Oracle ermittelt das Argument mit der höchsten numerischen Priorität und konvertiert die verbleibenden Argumente implizit in diesen Datentyp. Der Rückgabetyp ist auch dieser Datentyp, sofern für eine einzelne Funktion nichts anderes angegeben ist.
Siehe auch:
„Numeric Precedence“ for information on numeric precedence and Table 3-10, „Implicit Type Conversion Matrix“ for more information on implicit conversion
analytic_clause
Use OVER
analytic_clause
to indicate that the function operates on a query result set. This clause is computed after the FROM
WHERE
GROUP
BY
, and HAVING
clauses. Sie können Analysefunktionen mit dieser Klausel in der select-Liste oder ORDER
BY
-Klausel angeben. Um die Ergebnisse einer Abfrage basierend auf einer Analysefunktion zu filtern, verschachteln Sie diese Funktionen in der übergeordneten Abfrage, und filtern Sie dann die Ergebnisse der verschachtelten Unterabfrage.
Hinweise zur analytic_clause: Die folgenden Hinweise gelten für analytic_clause
:
-
Sie können Analysefunktionen nicht verschachteln, indem Sie eine Analysefunktion in einem Teil von
analytic_clause
angeben. Sie können jedoch eine Analysefunktion in einer Unterabfrage angeben und eine andere Analysefunktion darüber berechnen. -
Sie können
OVER
analytic_clause
mit benutzerdefinierten Analysefunktionen sowie integrierten Analysefunktionen angeben. Siehe FUNKTION ERSTELLEN.
query_partition_clause
Verwenden Sie die PARTITION
BY
-Klausel, um die Abfrageergebnismenge in Gruppen basierend auf einem oder mehreren value_expr
zu partitionieren. Wenn Sie diese Klausel weglassen, behandelt die Funktion alle Zeilen der Abfrageergebnismenge als eine einzelne Gruppe.
Um die query_partition_clause
in einer Analysefunktion zu verwenden, verwenden Sie den oberen Zweig der Syntax (ohne Klammern). Um diese Klausel in einer Modellabfrage (im model_column_clauses
) oder einem partitionierten äußeren Join (im outer_join_clause
) zu verwenden, verwenden Sie den unteren Zweig der Syntax (mit Klammern).
Sie können mehrere Analysefunktionen in derselben Abfrage angeben, jede mit demselben oder unterschiedlichen PARTITION
BY
Schlüsseln.
Wenn die abgefragten Objekte das Attribut parallel haben und Sie eine Analysefunktion mit der query_partition_clause
angeben, werden auch die Funktionsberechnungen parallelisiert.
Gültige Werte von value_expr
sind Konstanten, Spalten, nichtanalytische Funktionen, Funktionsausdrücke oder Ausdrücke, die eines dieser Elemente beinhalten.
order_by_clause
Verwenden Sie order_by_clause
, um anzugeben, wie Daten innerhalb einer Partition geordnet werden. Für alle Analysefunktionen können Sie die Werte in einer Partition auf mehreren Schlüsseln anordnen, die jeweils durch eine value_expr
definiert und jeweils durch eine Bestellsequenz qualifiziert sind.
Innerhalb jeder Funktion können Sie mehrere Sortierausdrücke angeben. Dies ist besonders nützlich, wenn Funktionen verwendet werden, die Werte ordnen, da der zweite Ausdruck Verknüpfungen zwischen identischen Werten für den ersten Ausdruck auflösen kann.
Immer wenn order_by_clause
zu identischen Werten für mehrere Zeilen führt, verhält sich die Funktion wie folgt:
-
CUME_DIST
DENSE_RANK
NTILE
PERCENT_RANK
undRANK
geben für jedes der Reihen. -
ROW_NUMBER
weist jeder Zeile einen eindeutigen Wert zu, auch wenn ein Gleichstand basierend auf demorder_by_clause
. Der Wert basiert auf der Reihenfolge, in der die Zeile verarbeitet wird, und kann nicht deterministisch sein, wennORDER
BY
keine Gesamtreihenfolge garantiert. -
Für alle anderen Analysefunktionen hängt das Ergebnis von der Fensterspezifikation ab. Wenn Sie ein logisches Fenster mit dem Schlüsselwort
RANGE
angeben, gibt die Funktion für jede Zeile dasselbe Ergebnis zurück. Wenn Sie ein physisches Fenster mit dem SchlüsselwortROWS
angeben, ist das Ergebnis nicht deterministisch.
Einschränkungen der ORDER BY-Klausel Die folgenden Einschränkungen gelten für die ORDER
BY
-Klausel:
-
Bei Verwendung in einer Analysefunktion muss
order_by_clause
einen Ausdruck annehmen (expr
). Das SchlüsselwortSIBLINGS
ist ungültig (es ist nur in hierarchischen Abfragen relevant). Position (position
) und Spaltenaliase (c_alias
) sind ebenfalls ungültig. Andernfalls ist dieseorder_by_clause
die gleiche wie die Reihenfolge der Gesamtabfrage oder Unterabfrage. -
An analytic function that uses the
RANGE
keyword can use multiple sort keys in itsORDER
BY
clause if it specifies any of the following windows:-
RANGE
BETWEEN
UNBOUNDED
PRECEDING
AND
CURRENT
ROW
. The short form of this isRANGE
UNBOUNDED
PRECEDING
. -
RANGE
BETWEEN
CURRENT
ROW
AND
UNBOUNDED
FOLLOWING
-
RANGE
BETWEEN
CURRENT
ROW
AND
CURRENT
ROW
-
RANGE
BETWEEN
UNBOUNDED
PRECEDING
AND
UNBOUNDED
FOLLOWING
Andere Fenstergrenzen als diese vier können nur einen Sortierschlüssel in der
ORDER
BY
Klausel der Analysefunktion haben. Diese Einschränkung gilt nicht für Fenstergrenzen, die durch das SchlüsselwortROW
angegeben werden. -
ASC / DESC Geben Sie die Reihenfolge an (aufsteigend oder absteigend). ASC
ist der Standardwert.
NULLS FIRST / NULLS LAST Geben Sie an, ob zurückgegebene Zeilen mit Nullen zuerst oder zuletzt in der Reihenfolge angezeigt werden sollen.
NULLS
LAST
ist der Standardwert für aufsteigende Reihenfolge und NULLS
FIRST
ist der Standardwert für absteigende Reihenfolge.
Analysefunktionen arbeiten immer mit Zeilen in der Reihenfolge, die im order_by_clause
der Funktion angegeben ist. Die order_by_clause
der Funktion garantiert jedoch nicht die Reihenfolge des Ergebnisses. Verwenden Sie die order_by_clause
der Abfrage, um die Reihenfolge der Endergebnisse zu gewährleisten.
Siehe auch:
order_by_clause of SELECT für weitere Informationen zu dieser Klausel
windowing_clause
Einige Analysefunktionen erlauben die windowing_clause
. In der Auflistung der Analysefunktionen am Ende dieses Abschnitts werden die Funktionen, die das windowing_clause
zulassen, von einem Sternchen (*) gefolgt.
ROWS / RANGE Diese Schlüsselwörter definieren für jede Zeile ein Fenster (eine physikalische oder logische Menge von Zeilen), das zur Berechnung des Funktionsergebnisses verwendet wird. Die Funktion wird dann auf alle Zeilen im Fenster angewendet. Das Fenster bewegt sich durch die Abfrageergebnismenge oder Partition von oben nach unten.
-
ROWS
gibt das Fenster in physikalischen Einheiten (Zeilen) an. -
RANGE
gibt das Fenster als logischen Offset an.
Sie können diese Klausel nur angeben, wenn Sie die order_by_clause
angegeben haben. Einige Fenstergrenzen, die durch die RANGE
-Klausel definiert werden, lassen Sie nur einen Ausdruck in der order_by_clause
angeben. Siehe „Einschränkungen der ORDER BY-Klausel“.
Der von einer Analysefunktion mit logischem Offset zurückgegebene Wert ist immer deterministisch. Der von einer Analysefunktion mit einem physikalischen Offset zurückgegebene Wert kann jedoch zu nichtdeterministischen Ergebnissen führen, es sei denn, der Ordnungsausdruck führt zu einer eindeutigen Reihenfolge. Möglicherweise müssen Sie mehrere Spalten in order_by_clause
angeben, um diese eindeutige Reihenfolge zu erreichen.
ZWISCHEN … UND Verwenden Sie die BETWEEN
AND
-Klausel, um einen Start- und Endpunkt für das Fenster anzugeben. Der erste Ausdruck (vor AND
) definiert den Startpunkt und der zweite Ausdruck (nach AND
) definiert den Endpunkt.
Wenn Sie BETWEEN
weglassen und nur einen Endpunkt angeben, betrachtet Oracle ihn als Startpunkt und der Endpunkt ist standardmäßig die aktuelle Zeile.
UNBOUNDED: Geben Sie UNBOUNDED
PRECEDING
an, um anzuzeigen, dass das Fenster in der ersten Zeile der Partition beginnt. Dies ist die Startpunktspezifikation und kann nicht als Endpunktspezifikation verwendet werden.Geben Sie UNBOUNDED
FOLLOWING
an, um anzuzeigen, dass das Fenster in der letzten Zeile der Partition endet. Dies ist die Endpunktspezifikation und kann nicht als Startpunktspezifikation verwendet werden.
AKTUELLE ZEILE Als Startpunkt gibt CURRENT
ROW
an, dass das Fenster mit der aktuellen Zeile oder dem aktuellen Wert beginnt (je nachdem, ob Sie ROW
bzw. RANGE
angegeben haben). In diesem Fall kann der Endpunkt nicht value_expr
PRECEDING
.
Als Endpunkt gibt CURRENT
ROW
an, dass das Fenster an der aktuellen Zeile oder dem aktuellen Wert endet (je nachdem, ob Sie ROW
bzw. RANGE
angegeben haben). In diesem Fall kann der Startpunkt nicht value_expr
FOLLOWING
.
value_expr PRECEDING oder value_expr FOLLOWING Für RANGE
oder ROW
:
-
Wenn
value_expr
FOLLOWING
der Startpunkt ist, muss der Endpunktvalue_expr
FOLLOWING
sein. -
Wenn
value_expr
PRECEDING
der Endpunkt ist, muss der Startpunktvalue_expr
PRECEDING
sein.
Wenn Sie ein logisches Fenster definieren, das durch ein Zeitintervall im numerischen Format definiert ist, müssen Sie möglicherweise Konvertierungsfunktionen verwenden.
Siehe auch:
NUMTOYMINTERVAL und NUMTODSINTERVAL für Informationen zur Umwandlung numerischer Zeiten in Intervalle
Wenn Sie ROWS
angegeben haben:
-
value_expr
ist ein physikalischer Offset. Es muss eine Konstante oder ein Ausdruck sein und zu einem positiven numerischen Wert ausgewertet werden. -
Wenn
value_expr
Teil des Startpunkts ist, muss es zu einer Zeile vor dem Endpunkt ausgewertet werden.
Wenn Sie RANGE
angegeben haben:
-
value_expr
ist ein logischer Offset. Es muss sich um eine Konstante oder einen Ausdruck handeln, der einen positiven numerischen Wert oder ein Intervallliteral ergibt. Informationen zu Intervallliteralen finden Sie unter „Literale“. -
Sie können nur einen Ausdruck im
order_by_clause
angeben. -
Wenn
value_expr
einen numerischen Wert ergibt, muss dieORDER
BY
expr
eine numerische oderDATE
Datentyp. -
If
value_expr
evaluates to an interval value, then theORDER
BY
expr
must be aDATE
data type.
If you omit the windowing_clause
entirely, then the default is RANGE
BETWEEN
UNBOUNDED
PRECEDING
AND
CURRENT
ROW
.
Analytic functions are commonly used in data warehousing environments. In der folgenden Liste der Analysefunktionen erlauben Funktionen, denen ein Sternchen (*) folgt, die vollständige Syntax, einschließlich der windowing_clause
.
AVG *
CORR *
ANZAHL *
COVAR_POP *
COVAR_SAMP *
CUME_DIST
DENSE_RANK
ERSTER
FIRST_VALUE *
VERZÖGERUNG
LETZTER
LAST_VALUE *
BLEI
LISTAGG
MAX *
MEDIAN
MIN *
NTH_VALUE *
NTILE
PERCENT_RANK
PERCENTILE_CONT
PERCENTILE_DISC
RANG
RATIO_TO_REPORT
REGR_ (Lineare Regression) Funktionen *
ROW_NUMBER
STDDEV *
STDDEV_POP *
STDDEV_SAMP *
SUMME *
VAR_POP *
VAR_SAMP *
VARIANZ *
Siehe auch:
Oracle Database Data Warehousing Guide für weitere Informationen zu diesen Funktionen und für Szenarien, die ihre Verwendung veranschaulichen