funcțiile analitice calculează o valoare agregată bazată pe un grup de rânduri. Ele diferă de funcțiile agregate prin faptul că returnează mai multe rânduri pentru fiecare grup. Grupul de rânduri se numește fereastră și este definit de analytic_clause
. Pentru fiecare rând, este definită o fereastră glisantă de rânduri. Fereastra determină intervalul de rânduri utilizate pentru a efectua calculele pentru rândul curent. Dimensiunile ferestrelor se pot baza fie pe un număr fizic de rânduri, fie pe un interval logic, cum ar fi timpul.
funcțiile analitice sunt ultimul set de operații efectuate într-o interogare, cu excepția clauzei finaleORDER
BY
. Toate se alătură și toateWHERE
GROUP
BY
, șiHAVING
clauzele sunt finalizate înainte de funcțiile analitice sunt procesate. Prin urmare, funcțiile analitice pot apărea numai în lista select sau ORDER
BY
clauza.
funcțiile analitice sunt utilizate în mod obișnuit pentru a calcula agregatele cumulative, în mișcare, centrate și de raportare.
analitic_function::=
descrierea ilustrației „analitic_function.gif „
analytic_clause::=
descrierea ilustrației „analitic_clause.gif „
query_partition_clause::=
descrierea ilustrației „query_partition_clause.gif „
order_by_clause::=
descrierea ilustrației „order_by_clause.gif „
windowing_clause:: =
descrierea ilustrației „windowing_clause.gif „
semantica acestei sintaxe sunt discutate în secțiunile care urmează.
analytic_function
specificați numele unei funcții analitice (a se vedea lista funcțiilor analitice în urma acestei discuții de semantică).
argumente
funcțiile analitice iau 0 până la 3 argumente. Argumentele pot fi orice tip de date numerice sau orice tip de date non-numerice care pot fi convertite implicit într-un tip de date numerice. Oracle determină argumentul cu cea mai mare prioritate numerică și convertește implicit argumentele rămase la acel tip de date. Tipul de returnare este, de asemenea, acel tip de date, cu excepția cazului în care se specifică altfel pentru o funcție individuală.
Vezi și:
„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. Puteți specifica funcții analitice cu această clauză în lista select sauORDER
BY
clauza. Pentru a filtra rezultatele unei interogări bazate pe o funcție analitică, cuib aceste funcții în interogarea părinte, și apoi se filtrează rezultatele subinterogării imbricate.
Note privind analitic_clause: următoarele note se aplicăanalytic_clause
:
-
nu puteți cuibări funcții analitice specificând orice funcție analitică în orice parte a
analytic_clause
. Cu toate acestea, puteți specifica o funcție analitică într-o subinterogare și puteți calcula o altă funcție analitică peste ea. -
puteți specifica
OVER
analytic_clause
cu funcții analitice definite de utilizator, precum și funcții analitice încorporate. A se vedea crearea funcției.
query_partition_clause
utilizați clauzaPARTITION
BY
pentru a împărți rezultatul interogării setat în grupuri bazate pe unul sau mai multevalue_expr
. Dacă omiteți această clauză, atunci funcția tratează toate rândurile setului de rezultate ale interogării ca un singur grup.
pentru a utilizaquery_partition_clause
într-o funcție analitică, utilizați ramura superioară a sintaxei (fără paranteze). Pentru a utiliza această clauză într-o interogare de model (în model_column_clauses
) sau o asociere exterioară partiționată (în outer_join_clause
), utilizați ramura inferioară a sintaxei (cu paranteze).
puteți specifica mai multe funcții analitice în aceeași interogare, fiecare cu aceleași sau diferitePARTITION
BY
chei.
dacă obiectele interogate au atributul paralel și dacă specificați o funcție analitică cuquery_partition_clause
, atunci și calculele funcției sunt paralelizate.
Valorile valide alevalue_expr
sunt constante, coloane, funcții nonanalitice, expresii funcționale sau expresii care implică oricare dintre acestea.
order_by_clause
utilizațiorder_by_clause
pentru a specifica modul în care datele sunt ordonate într-o partiție. Pentru toate funcțiile analitice puteți comanda valorile dintr-o partiție pe mai multe taste, fiecare definită printr-un value_expr
și fiecare calificată printr-o secvență de ordonare.
în cadrul fiecărei funcții, puteți specifica mai multe expresii de comandă. Acest lucru este util mai ales atunci când se utilizează funcții care clasifică valori, deoarece a doua expresie poate rezolva legăturile dintre valori identice pentru prima expresie.
ori de câte ori order_by_clause
are ca rezultat valori identice pentru mai multe rânduri, funcția se comportă după cum urmează:
-
CUME_DIST
DENSE_RANK
NTILE
PERCENT_RANK
șiRANK
returnați același rezultat pentru fiecare dintre rânduri. -
ROW_NUMBER
atribuie fiecărui rând o valoare distinctă chiar dacă există o egalitate bazată peorder_by_clause
. Valoarea se bazează pe ordinea în care este procesat rândul, care poate fi nedeterministă dacăORDER
BY
nu garantează o comandă totală. -
pentru toate celelalte funcții analitice, rezultatul depinde de specificația ferestrei. Dacă specificați o fereastră logică cu
RANGE
cuvânt cheie, atunci funcția returnează același rezultat pentru fiecare dintre rânduri. Dacă specificați o fereastră fizică cuROWS
cuvânt cheie, atunci rezultatul este nedeterminist.
restricții privind clauza ORDER BY următoarele restricții se aplică clauzei ORDER
BY
:
-
atunci când este utilizat într-o funcție analitică,
order_by_clause
trebuie să ia o expresie (expr
). Cuvântul cheieSIBLINGS
nu este valid (este relevant numai în interogările ierarhice). Poziția (position
) și pseudonimele de coloană (c_alias
) Sunt de asemenea nevalide. În caz contrar, acestorder_by_clause
este același cu cel utilizat pentru a comanda interogarea sau subinterogarea generală. -
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
limitele ferestrei, altele decât aceste patru, pot avea o singură cheie de sortare în clauza
ORDER
BY
a funcției analitice. Această restricție nu se aplică limitelor ferestrei specificate de cuvântul cheieROW
. -
ASC / DESC specifică secvența de ordonare (ascendentă sau descendentă). ASC
este implicit.
NULLS FIRST / Nulls LAST specificați dacă rândurile returnate care conțin nulls ar trebui să apară primele sau ultimele în secvența de ordonare.
NULLS
LAST
este implicit pentru ordinea crescătoare și NULLS
FIRST
este implicit pentru ordinea descrescătoare.
funcțiile analitice funcționează întotdeauna pe rânduri în ordinea specificată înorder_by_clause
a funcției. Cu toate acestea, order_by_clause
a funcției nu garantează ordinea rezultatului. Utilizați order_by_clause
al interogării pentru a garanta ordonarea rezultatului final.
Vezi și:
order_by_clause din SELECT pentru mai multe informații despre această clauză
windowing_clause
unele funcții analitice permitwindowing_clause
. În lista funcțiilor analitice de la sfârșitul acestei secțiuni, funcțiile care permit windowing_clause
sunt urmate de un asterisc (*).
rânduri / interval aceste cuvinte cheie definesc pentru fiecare rând o fereastră (un set fizic sau logic de rânduri) utilizată pentru calcularea rezultatului funcției. Funcția este apoi aplicată tuturor rândurilor din fereastră. Fereastra se deplasează prin setul de rezultate de interogare sau partiția de sus în jos.
-
ROWS
specifică fereastra în unități fizice (rânduri). -
RANGE
specifică fereastra ca o compensare logică.
nu puteți specifica această clauză decât dacă ați specificatorder_by_clause
. Unele limite de fereastră definite deRANGE
clauza vă permit să specificați o singură expresie înorder_by_clause
. Consultați „restricții privind clauza ORDER BY”.
valoarea returnată de o funcție analitică cu un offset logic este întotdeauna deterministă. Cu toate acestea, valoarea returnată de o funcție analitică cu o compensare fizică poate produce rezultate nedeterministe, cu excepția cazului în care expresia de ordonare are ca rezultat o ordonare unică. Poate fi necesar să specificați mai multe coloane în order_by_clause
pentru a realiza această comandă unică.
între … Și utilizați BETWEEN
AND
clauză pentru a specifica un punct de început și un punct final pentru fereastră. Prima expresie (înainte de AND
) definește punctul de început și a doua expresie (după AND
) definește punctul final.
dacă omiteți BETWEEN
și specificați un singur punct final, atunci Oracle îl consideră punctul de pornire, iar punctul final este implicit la rândul curent.
nelimitat precizațiUNBOUNDED
PRECEDING
pentru a indica faptul că fereastra începe de la primul rând al partiției. Aceasta este specificația punctului de pornire și nu poate fi utilizată ca specificație a punctului final.
nelimitat în urma specificaUNBOUNDED
FOLLOWING
pentru a indica faptul că fereastra se termină la ultimul rând al partiției. Aceasta este specificația punctului final și nu poate fi utilizată ca specificație a punctului de pornire.
rândul curent ca punct de pornire,CURRENT
ROW
specifică faptul că fereastra începe la rândul sau valoarea curentă (în funcție de dacă ați specificatROW
sauRANGE
, respectiv). În acest caz, punctul final nu poate fi value_expr
PRECEDING
.
ca punct final,CURRENT
ROW
specifică faptul că fereastra se termină la rândul sau valoarea curentă (în funcție de dacă ați specificatROW
sauRANGE
, respectiv). În acest caz, punctul de pornire nu poate fi value_expr
FOLLOWING
.
value_expr precedent sau value_expr următor pentru RANGE
sau ROW
:
-
dacă
value_expr
FOLLOWING
este punctul de pornire, atunci punctul final trebuie să fievalue_expr
FOLLOWING
. -
dacă
value_expr
PRECEDING
este punctul final, atunci punctul de pornire trebuie să fievalue_expr
PRECEDING
.
dacă definiți o fereastră logică definită de un interval de timp în format numeric, atunci poate fi necesar să utilizați funcții de conversie.
Vezi și:
NUMTOYMINTERVAL și NUMTODSINTERVAL pentru informații despre conversia timpilor numerici în intervale
dacă ați specificatROWS
:
-
value_expr
este o compensare fizică. Trebuie să fie o constantă sau o expresie și trebuie să evalueze la o valoare numerică pozitivă. -
dacă
value_expr
face parte din punctul de pornire, atunci trebuie să evalueze la un rând înainte de punctul final.
dacă ați specificatRANGE
:
-
value_expr
este o compensare logică. Trebuie să fie o constantă sau o expresie care se evaluează la o valoare numerică pozitivă sau la un interval literal. Consultați „literali” pentru informații despre literali de interval. -
puteți specifica o singură expresie în
order_by_clause
. -
dacă
value_expr
se evaluează la o valoare numerică, atunciORDER
BY
expr
trebuie să fie un ID numeric sauDATE
tip de date. -
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. În lista funcțiilor analitice care urmează, funcțiile urmate de un asterisc (*) permit sintaxa completă, inclusiv windowing_clause
.
AVG *
CORR *
COUNT *
COVAR_POP *
COVAR_SAMP *
CUME_DIST
DENSE_RANK
FIRST
FIRST_VALUE *
LAG
LAST
LAST_VALUE *
LEAD
LISTAGG
MAX *
MEDIAN
MIN *
NTH_VALUE *
NTILE
percent_rank
PERCENTILE_CONT
percentile_disc
rank
ratio_to_report
regr_ (regresie liniară) funcții *
ROW_NUMBER
stddev *
STDDEV_POP *
stddev_samp *
sumă *
var_pop *
var_samp *
varianță *
vezi de asemenea:
Oracle Database Data ghid de depozitare pentru mai multe informații despre aceste funcții și pentru scenarii care ilustrează utilizarea lor