analytische functies berekenen een geaggregeerde waarde op basis van een groep rijen. Ze verschillen van geaggregeerde functies in die zin dat ze meerdere rijen voor elke groep retourneren. De groep rijen wordt een venster genoemd en wordt gedefinieerd door de analytic_clause
. Voor elke rij wordt een schuifraam van rijen gedefinieerd. Het venster bepaalt het bereik van de rijen die worden gebruikt om de berekeningen voor de huidige rij uit te voeren. Vensterformaten kunnen gebaseerd zijn op een fysiek aantal rijen of een logisch interval zoals tijd.
analytische functies zijn de laatste reeks bewerkingen die in een query worden uitgevoerd, met uitzondering van de uiteindelijke ORDER
BY
clausule. Alle joins en alleWHERE
GROUP
BY
, enHAVING
clausules zijn voltooid voordat de analytische functies worden verwerkt. Daarom kunnen analytische functies alleen verschijnen in de select list of ORDER
BY
clausule.
analytische functies worden vaak gebruikt om cumulatieve, bewegende, gecentreerde en rapportage-aggregaten te berekenen.
analytic_function::=
beschrijving van de illustratie ” analytic_function.gif “
analytic_clause::=
beschrijving van de illustratie ” analytic_clause.gif “
query_partition_clause::=
beschrijving van de illustratie ” query_partition_clause.gif “
order_by_clause::=
beschrijving van de illustratie ” order_by_clause.gif “
windowing_clause ::=
beschrijving van de illustratie ” windowing_clause.gif “
de semantiek van deze syntaxis wordt besproken in de volgende secties.
analytische functie
specificeer de naam van een analytische functie (zie de lijst van analytische functies na deze bespreking van de semantiek).
argumenten
analytische functies hebben 0 tot 3 argumenten. De argumenten kunnen elk numeriek gegevenstype zijn of elk niet-numeriek gegevenstype dat impliciet kan worden geconverteerd naar een numeriek gegevenstype. Oracle bepaalt het argument met de hoogste numerieke voorrang en converteert impliciet de resterende argumenten naar dat gegevenstype. Het retourtype is ook dat gegevenstype, tenzij anders vermeld voor een individuele functie.
zie ook:
“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. U kunt analytische functies opgeven met deze clausule in de select list of ORDER
BY
clausule. Als u de resultaten van een query wilt filteren op basis van een analytische functie, plaatst u deze functies in de bovenliggende query en filtert u vervolgens de resultaten van de geneste subquery.
opmerkingen over de analytic_clause: de volgende opmerkingen zijn van toepassing op de analytic_clause
:
-
u kunt geen analytische functies nestelen door een analytische functie op te geven in een deel van de
analytic_clause
. U kunt echter een analytische functie opgeven in een subquery en er een andere analytische functie over berekenen. -
u kunt
OVER
analytic_clause
opgeven met door de gebruiker gedefinieerde analytische functies en ingebouwde analytische functies. Zie functie maken.
query_partition_clause
Gebruik de PARTITION
BY
clausule om het queryresultaat te verdelen in groepen op basis van een of meer value_expr
. Als u deze clausule weglaat, behandelt de functie alle rijen van het querieresultaatset als een enkele groep.
om de query_partition_clause
in een analytische functie te gebruiken, gebruikt u de bovenste tak van de syntaxis (zonder haakjes). Om deze clausule te gebruiken in een model query (in de model_column_clauses
) of een gepartitioneerde buitenste join (in de outer_join_clause
), gebruik de onderste tak van de syntaxis (met haakjes).
u kunt meerdere analytische functies opgeven in dezelfde query, elk met dezelfde of verschillende PARTITION
BY
sleutels.
als de objecten die worden opgevraagd het parallelle attribuut hebben, en als u een analytische functie specificeert met de query_partition_clause
, dan worden de functieberekeningen ook parallelliseerd.
geldige waarden van value_expr
zijn constanten, kolommen, niet-analytische functies, functie-expressies, of expressies met een van deze.
order_by_clause
Gebruik de order_by_clause
om aan te geven hoe gegevens worden geordend binnen een partitie. Voor alle analytische functies kunt u de waarden in een partitie op meerdere sleutels bestellen, elk gedefinieerd door een value_expr
en elk gekwalificeerd door een volgorde.
binnen elke functie kunt u meerdere orderuitdrukkingen opgeven. Dit doen is vooral handig bij het gebruik van functies die waarden rangschikken, omdat de tweede expressie banden tussen identieke waarden voor de eerste expressie kan oplossen.
wanneer de order_by_clause
resulteert in identieke waarden voor meerdere rijen, gedraagt de functie zich als volgt:
-
CUME_DIST
DENSE_RANK
NTILE
PERCENT_RANK
, enRANK
retourneren hetzelfde resultaat voor elk van de rijen. -
ROW_NUMBER
kent elke rij een aparte waarde toe, zelfs als er een gelijkspel is gebaseerd oporder_by_clause
. De waarde is gebaseerd op de volgorde waarin de rij wordt verwerkt, die niet-deterministisch kan zijn als deORDER
BY
geen volledige volgorde garandeert. -
voor alle andere analytische functies hangt het resultaat af van de vensterspecificatie. Als u een logisch venster opgeeft met het
RANGE
sleutelwoord, dan geeft de functie hetzelfde resultaat terug voor elk van de rijen. Als u een fysiek venster opgeeft met hetROWS
sleutelwoord, dan is het resultaat niet-deterministisch.
Restrictions on the ORDER BY Clause de volgende restrictions zijn van toepassing op deORDER
BY
clausule:
-
indien gebruikt in een analytische functie, moet
order_by_clause
een expressie hebben (expr
). Het sleutelwoordSIBLINGS
is niet geldig (Het is alleen relevant in hiërarchische query ‘ s). Positie (position
) en kolom aliassen (c_alias
) zijn ook ongeldig. Anders is dezeorder_by_clause
dezelfde als die gebruikt wordt om de Algemene query of subquery te bestellen. -
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 venstergrenzen dan deze Vier kunnen slechts één sorteersleutel hebben in de
ORDER
BY
clausule van de analytische functie. Deze beperking is niet van toepassing op venstergrenzen gespecificeerd door hetROW
sleutelwoord. -
-
ROWS
specificeert het venster in fysieke eenheden (rijen). -
RANGE
specificeert het venster als een logische verschuiving. -
als
value_expr
FOLLOWING
het beginpunt is, moet het eindpuntvalue_expr
FOLLOWING
zijn. -
als
value_expr
PRECEDING
het eindpunt is, moet het beginpuntvalue_expr
PRECEDING
zijn. -
value_expr
is een fysieke offset. Het moet een constante of uitdrukking zijn en moet een positieve numerieke waarde hebben. -
als
value_expr
deel uitmaakt van het beginpunt, moet het evalueren tot een rij voor het eindpunt. -
value_expr
is een logische verschuiving. Het moet een constante of uitdrukking zijn die evalueert naar een positieve numerieke waarde of een interval letterlijke. Refereer naar “Literals” voor informatie over interval literals. -
u kunt slechts één expressie opgeven in de
order_by_clause
. -
als
value_expr
evalueert tot een numerieke waarde, dan moetORDER
BY
expr
Een numerieke waarde zijn ofDATE
gegevenstype. -
If
value_expr
evaluates to an interval value, then theORDER
BY
expr
must be aDATE
data type.
ASC / DESC specificeer de volgorde (oplopend of aflopend). ASC
is de standaard.
NULLS FIRST / NULLS LAST specificeer of geretourneerde rijen met nulls als eerste of als laatste moeten verschijnen in de volgorde.
NULLS
LAST
is de standaard voor aflopende volgorde, en NULLS
FIRST
is de standaard voor aflopende volgorde.
analytische functies werken altijd op rijen in de volgorde die is opgegeven in de order_by_clause
van de functie. De order_by_clause
van de functie garandeert echter niet de volgorde van het resultaat. Gebruik de order_by_clause
van de query om het uiteindelijke resultaat te garanderen.
zie ook:
order_by_clause of SELECT voor meer informatie over deze clausule
windowing_clause
sommige analytische functies staan de windowing_clause
toe. In de lijst van analytische functies aan het einde van deze paragraaf, worden de functies die windowing_clause
toestaan, gevolgd door een sterretje (*).
rijen / bereik deze sleutelwoorden definiëren voor elke rij een venster (een fysieke of logische reeks rijen) dat wordt gebruikt voor het berekenen van het functieresultaat. De functie wordt vervolgens toegepast op alle rijen in het venster. Het venster beweegt door de query resultaat set of partitie van boven naar beneden.
U kunt deze clausule niet specificeren tenzij u de order_by_clause
hebt opgegeven. Sommige venstergrenzen gedefinieerd door de RANGE
clausule laten u slechts één expressie specificeren in de order_by_clause
. Zie “beperkingen op de ORDER BY clausule”.
de waarde die wordt geretourneerd door een analytische functie met een logische offset is altijd deterministisch. De waarde die door een analytische functie met een fysieke offset wordt geretourneerd, kan echter niet-deterministische resultaten opleveren, tenzij de orderuitdrukking resulteert in een unieke volgorde. Mogelijk moet u meerdere kolommen opgeven in de order_by_clause
om deze unieke volgorde te bereiken.
tussen … En gebruik de BETWEEN
AND
clausule om een begin-en eindpunt voor het venster te specificeren. De eerste expressie (vóór AND
) definieert het beginpunt en de tweede expressie (na AND
) definieert het eindpunt.
Als u BETWEEN
weglaat en slechts één eindpunt opgeeft, dan beschouwt Oracle dit als het beginpunt en staat het eindpunt standaard op de huidige rij.
UNBOUNDED PREFORE Specificeer UNBOUNDED
PRECEDING
om aan te geven dat het venster begint op de eerste rij van de partitie. Dit is de beginpunt specificatie en kan niet worden gebruikt als een eindpunt specificatie.
Unbound following Specificeer UNBOUNDED
FOLLOWING
om aan te geven dat het venster eindigt op de laatste rij van de partitie. Dit is de eindpuntspecificatie en kan niet als beginpuntspecificatie worden gebruikt.
huidige rij als startpunt geeft CURRENT
ROW
aan dat het venster begint op de huidige rij of waarde (afhankelijk van of u ROW
of RANGE
hebt opgegeven). In dit geval kan het eindpunt niet value_expr
PRECEDING
zijn.
als eindpunt geeft CURRENT
ROW
aan dat het venster eindigt op de huidige rij of waarde (afhankelijk van of u ROW
of RANGE
hebt opgegeven). In dit geval kan het beginpunt niet value_expr
FOLLOWING
zijn.
value_expr PREFORE or value_expr FOLLOWING For RANGE
or ROW
:
als u een logisch venster definieert dat wordt gedefinieerd door een tijdsinterval in numeriek formaat, dan moet u mogelijk conversiefuncties gebruiken.
zie ook:
NUMTOYMINTERVAL en NUMTODSINTERVAL voor informatie over het omzetten van numerieke tijden in intervallen
Als u ROWS
opgeeft:
Als u RANGE
opgeeft:
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 de lijst met analytische functies die volgt, staan functies gevolgd door een sterretje (*) de volledige syntaxis toe, inclusief de windowing_clause
.
AVG *
CORR *
GRAAF *
COVAR_POP *
COVAR_SAMP *
REGR_SXX
DENSE_RANK
EERSTE
EERSTE_WAARDE *
LAG
LAATSTE
LAST_VALUE *
LEIDEN
LISTAGG
MAX *
MEDIAAN
MIN *
NTH_VALUE *
NTILE
PERCENT_RANK
PERCENTILE_CONT
PERCENTILE_DISC
RANK
RATIO_TO_REPORT
REGR_ (Lineaire Regressie) Functies *
ROW_NUMBER
STDDEV *
STDDEV_POP *
STDDEV_SAMP *
SUM *
VAR_POP *
VAR_SAMP *
VARIANTIE *
Zie Ook:
Oracle Database Data Warehousing Guide voor meer informatie over deze functies en scenario ‘ s ter illustratie van hun gebruik