analytiska funktioner beräkna ett aggregerat värde baserat på en grupp rader. De skiljer sig från aggregerade funktioner genom att de returnerar flera rader för varje grupp. Gruppen av rader kallas ett fönster och definieras av analytic_clause
. För varje rad definieras ett skjutfönster med rader. Fönstret bestämmer radintervallet som används för att utföra beräkningarna för den aktuella raden. Fönsterstorlekar kan baseras på antingen ett fysiskt antal rader eller ett logiskt intervall som tid.
analytiska funktioner är den sista uppsättningen operationer som utförs i en fråga förutom den slutligaORDER
BY
klausul. Alla kopplingar och alla WHERE
GROUP
BY
och HAVING
klausuler är färdiga innan de analytiska funktionerna behandlas. Därför kan analytiska funktioner endast visas i select-listan eller ORDER
BY
klausul.
analytiska funktioner används ofta för att beräkna kumulativa, rörliga, centrerade och rapporterande aggregat.
analytic_function::=
beskrivning av illustrationen ”analytic_function.gif ”
analytic_clause::=
beskrivning av illustrationen ”analytic_clause.gif ”
query_partition_clause::=
beskrivning av illustrationen ”query_partition_clause.gif ”
order_by_clause:: =
beskrivning av illustrationen ”order_by_clause.gif ”
windowing_clause:: =
beskrivning av illustrationen ”windowing_clause.gif ”
semantiken för denna syntax diskuteras i de avsnitt som följer.
analytic_function
Ange namnet på en analytisk funktion (se listan över analytiska funktioner efter denna diskussion om semantik).
argument
analytiska funktioner tar 0 till 3 argument. Argumenten kan vara vilken numerisk datatyp som helst eller vilken icke-numerisk datatyp som implicit kan konverteras till en numerisk datatyp. Oracle bestämmer argumentet med högsta numeriska prioritet och konverterar implicit de återstående argumenten till den datatypen. Returtypen är också den datatypen, om inte annat anges för en enskild funktion.
Se även:
”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. Du kan ange analytiska funktioner med denna klausul i select-listan ellerORDER
BY
klausul. Om du vill filtrera resultaten av en fråga baserat på en analytisk funktion BoStar du dessa funktioner i den överordnade frågan och filtrerar sedan resultaten från den kapslade underfrågan.
anteckningar om analytic_clause: följande anteckningar gäller för analytic_clause
:
-
Du kan inte häcka analytiska funktioner genom att ange någon analytisk funktion i någon del av
analytic_clause
. Du kan dock ange en analytisk funktion i en underfråga och beräkna en annan analytisk funktion över den. -
Du kan ange
OVER
analytic_clause
med användardefinierade analytiska funktioner samt inbyggda analytiska funktioner. Se skapa funktion.
query_partition_clause
användPARTITION
BY
för att partitionera frågeresultatet i grupper baserat på ett eller fleravalue_expr
. Om du utelämnar denna klausul behandlar funktionen alla rader i frågeresultatet som en enda grupp.
Om du vill använda query_partition_clause
I en analytisk funktion använder du syntaxens övre gren (utan parenteser). För att använda denna klausul i en modellfråga (i model_column_clauses
) eller en partitionerad yttre koppling (i outer_join_clause
), använd syntaxens nedre gren (med parenteser).
Du kan ange flera analytiska funktioner i samma fråga, var och en med samma eller olika PARTITION
BY
nycklar.
om objekten som frågas har parallellattributet, och om du anger en analysfunktion med query_partition_clause
, är funktionsberäkningarna också parallelliserade.
giltiga värden för value_expr
är konstanter, kolumner, icke-analytiska funktioner, funktionsuttryck eller uttryck som involverar någon av dessa.
order_by_clause
användorder_by_clause
för att ange hur data beställs inom en partition. För alla analytiska funktioner kan du beställa värdena i en partition på flera tangenter, var och en definierad av ett value_expr
och var och en kvalificerad av en beställningssekvens.
inom varje funktion kan du ange flera beställningsuttryck. Det är särskilt användbart när du använder funktioner som rangordnar värden, eftersom det andra uttrycket kan lösa band mellan identiska värden för det första uttrycket.
När order_by_clause
resulterar i identiska värden för flera rader, fungerar funktionen enligt följande:
-
CUME_DIST
DENSE_RANK
NTILE
PERCENT_RANK
ochRANK
returnera samma resultat för var och en av raderna. -
ROW_NUMBER
tilldelar varje rad ett distinkt värde även om det finns ett slips baserat påorder_by_clause
. Värdet baseras på den ordning i vilken raden behandlas, vilket kan vara nondeterministiskt omORDER
BY
inte garanterar en total beställning. -
för alla andra analytiska funktioner beror resultatet på fönsterspecifikationen. Om du anger ett logiskt fönster med
RANGE
, returnerar funktionen samma resultat för var och en av raderna. Om du anger ett fysiskt fönster medROWS
, är resultatet nondeterministiskt.
Begränsningar för order BY-klausulen följande begränsningar gäller förORDER
BY
klausul:
-
när den används i en analysfunktion måste
order_by_clause
ta ett uttryck (expr
). NyckelordetSIBLINGS
är inte giltigt (det är endast relevant i hierarkiska frågor). Position (position
) och kolumnalias (c_alias
) är också ogiltiga. Annars är dettaorder_by_clause
detsamma som det som används för att beställa den övergripande frågan eller underfrågan. -
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
andra fönstergränser än dessa fyra kan bara ha en sorteringsnyckel i
ORDER
BY
klausul i analysfunktionen. Denna begränsning gäller inte fönstergränser som anges av sökordetROW
. -
-
ROWS
anger fönstret i fysiska enheter (rader). -
RANGE
anger fönstret som en logisk förskjutning. -
om
value_expr
FOLLOWING
är startpunkten måste slutpunkten varavalue_expr
FOLLOWING
. -
om
value_expr
PRECEDING
är slutpunkten måste startpunkten varavalue_expr
PRECEDING
. -
value_expr
är en fysisk förskjutning. Det måste vara en konstant eller uttryck och måste utvärdera till ett positivt numeriskt värde. -
om
value_expr
är en del av startpunkten måste den utvärderas till en rad före slutpunkten. -
value_expr
är en logisk förskjutning. Det måste vara en konstant eller ett uttryck som utvärderas till ett positivt numeriskt värde eller ett intervall bokstavligt. Se ”Literals” för information om intervalllitteraler. -
Du kan bara ange ett uttryck i
order_by_clause
. -
om
value_expr
utvärderas till ett numeriskt värde, måsteORDER
BY
expr
vara ett numeriskt ellerDATE
datatyp. -
If
value_expr
evaluates to an interval value, then theORDER
BY
expr
must be aDATE
data type.
ASC / DESC ange beställningssekvensen (stigande eller fallande). ASC
är standardvärdet.
NULLS FIRST / NULLS LAST ange om returnerade rader som innehåller nulls ska visas först eller sist i beställningssekvensen.
NULLS
LAST
är standard för stigande ordning och NULLS
FIRST
är standard för fallande ordning.
analytiska funktioner fungerar alltid på rader i den ordning som anges iorder_by_clause
för funktionen. Funktionen order_by_clause
garanterar dock inte resultatets ordning. Användorder_by_clause
för att garantera slutresultatet beställning.
Se även:
order_by_clause of SELECT för mer information om denna klausul
windowing_clause
vissa analytiska funktioner tillåterwindowing_clause
. I listan över analytiska funktioner i slutet av detta avsnitt följs de funktioner som tillåter windowing_clause
av en asterisk (*).
rader / intervall dessa nyckelord definierar för varje rad ett fönster (en fysisk eller logisk uppsättning rader) som används för att beräkna funktionsresultatet. Funktionen tillämpas sedan på alla rader i fönstret. Fönstret rör sig genom frågeresultatet eller partitionen från topp till botten.
Du kan inte ange denna klausul om du inte har angett order_by_clause
. Vissa fönstergränser definierade avRANGE
– klausulen låter dig bara ange ett uttryck iorder_by_clause
. Se ”begränsningar av ORDER BY-klausulen”.
värdet som returneras av en analytisk funktion med en logisk förskjutning är alltid deterministisk. Värdet som returneras av en analytisk funktion med en fysisk förskjutning kan emellertid ge icke-deterministiska resultat om inte beställningsuttrycket resulterar i en unik beställning. Du kan behöva ange flera kolumner i order_by_clause
för att uppnå denna unika beställning.
mellan … Och använd BETWEEN
AND
klausul för att ange en startpunkt och slutpunkt för fönstret. Det första uttrycket (före AND
) definierar startpunkten och det andra uttrycket (efter AND
) definierar slutpunkten.
om du utelämnar BETWEEN
och bara anger en slutpunkt, anser Oracle det som startpunkten och slutpunkten är standard för den aktuella raden.
obundet föregående angeUNBOUNDED
PRECEDING
för att indikera att fönstret startar vid partitionens första rad. Detta är startpunktsspecifikationen och kan inte användas som en slutpunktsspecifikation.
obundet följande angeUNBOUNDED
FOLLOWING
för att indikera att fönstret slutar vid partitionens sista rad. Detta är slutpunktsspecifikationen och kan inte användas som en startpunktsspecifikation.
aktuell rad som startpunkt angerCURRENT
ROW
att fönstret börjar vid den aktuella raden eller värdet (beroende på om du har angettROW
ellerRANGE
, respektive). I detta fall kan slutpunkten inte vara value_expr
PRECEDING
.
som slutpunkt anger CURRENT
ROW
att fönstret slutar vid den aktuella raden eller värdet (beroende på om du har angett ROW
eller RANGE
, respektive). I detta fall kan startpunkten inte vara value_expr
FOLLOWING
.
value_expr föregående eller value_expr följande för RANGE
eller ROW
:
om du definierar ett logiskt fönster definierat av ett tidsintervall i numeriskt format kan du behöva använda konverteringsfunktioner.
Se även:
NUMTOYMINTERVAL och NUMTODSINTERVAL för information om att konvertera numeriska tider till intervaller
Om du angav ROWS
:
Om du angav RANGE
:
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. I listan över analytiska funktioner som följer tillåter funktioner följt av en asterisk (*) hela syntaxen, inklusive windowing_clause
.
AVG *
CORR *
räkna *
COVAR_POP *
COVAR_SAMP *
CUME_DIST
DENSE_RANK
första
FIRST_VALUE *
LAG
sista
LAST_VALUE *
bly
LISTAGG
MAX *
MEDIAN
MIN *
NTH_VALUE *
NTILE
percentile_cont
PERCENTILE_DISC
rank
ratio_to_report
regr_ (linjär regression) funktioner *
ROW_NUMBER
STDDEV *
stddev_pop *
STDDEV_SAMP *
summa *
var_pop *
var_samp *
varians *
Se även:
Oracle Database datalagringsguide för mer information om dessa funktioner och för scenarier som illustrerar deras användning