analitikus függvénykoncepciók Standard SQL
egy analitikus függvény kiszámítja az értékeket egy sorcsoporton keresztül, és minden sorhoz egy-egy eredményként tér vissza. Ez különbözik az aggregált függvénytől, amely egyetlen eredményt ad a sorok csoportjához.
egy analitikus függvény tartalmaz egyOVER
záradékot, amely meghatározza a sorok ablakátaz értékelendő sor körül. Minden sor esetében az analitikus függvény eredményea sorok kiválasztott ablakának bemenetként történő kiszámításával lehetséges az aggregáció csökkentése.
analitikus függvények segítségével kiszámíthatja a mozgóátlagokat, a rangsorolt tételeket, a kalkulált összegeket, és más elemzéseket is elvégezhet.
analitikus függvényként a következő függvényeket lehet használni:navigációs funkciók,számozási függvények és analitikus függvények
analitikus függvény szintaxis
analytic_function_name ( ) OVER over_clauseover_clause: { named_window | ( ) }window_specification: ] ] window_frame_clause: { rows_range } { frame_start | frame_between }rows_range: { ROWS | RANGE }
jelölési szabályok
- szögletes zárójelek ” jelölik az opcionális záradékokat.
- zárójelek “() ” szó szerinti zárójeleket jelölnek.
- a ” / ” függőleges sáv logikai vagy.
- a “{} ” göndör zárójelek egy sor opciót tartalmaznak.
- egy vessző, amelyet egy ellipszis követ szögletes zárójelben “” jelzi, hogy az előző elem vesszővel elválasztott listában megismételhető.
leírás
egy analitikus függvény kiszámítja az eredményeket egy sorcsoporton keresztül. Használhatja thefollowing szintaxis építeni egy analitikus függvény:
-
analytic_function_name
: a függvény, amely elvégzi az analitikus művelet.Itt például aRANK()
számozási függvény használható. -
argument_list
: az analitikus függvényre jellemző érvek.Egyes funkciók vannak, egyesek nem. -
OVER
: AOVER
pontban megadott analitikus függvény szintaxisában szükséges kulcsszó. -
over_clause
: hivatkozás egy ablakra, amely meghatározza a táblázat sorainak egy csoportját, amelyre analitikus függvényt kell használni. -
window_specification
: az ablak specifikációit határozza meg. -
window_frame_clause
: meghatározza az ablak keretétaz ablakhoz. -
rows_range
: meghatározza az ablakkeret fizikai sorait vagy alogikus tartományát.
Megjegyzések
egy analitikus függvény skaláris kifejezésként jelenhet meg operand két helyen a lekérdezésben:
- a
SELECT
lista. Ha az analitikus függvény aSELECT
listában jelenik meg, annak argumentumlistája ésOVER
záradék nem hivatkozhat az ugyanabban a SELECT listában bevezetett álnevekre. - a
ORDER BY
záradék. Ha az analitikus függvény a lekérdezésORDER BY
záradékában jelenik meg, annak argumentumlistája aSELECT
listaaliasokra hivatkozhat.
egy analitikus függvény nem hivatkozhat egy másik analitikus függvényre az argument listájában, vagy annak OVER
záradékára, akár közvetve álnéven keresztül.
egy analitikus függvény kiértékelése az aggregáció után történik. Először például aGROUP BY
záradékot és a nem analitikus aggregált függvényeket értékeljük.Mivel az aggregált függvényeket az analitikus függvények előtt értékelik, az aggregált függvényeket input operandusként lehet használni az analitikus függvényekhez.
visszaadja
egyetlen eredmény minden sorban a bemenet.
A
analytic_function_name ( ) OVER over_clauseover_clause: { named_window | ( ) }
leírás
a OVER
záradék olyan ablakra utal, amely meghatározza a tableupon sorainak egy csoportját, amely analitikus függvényt használ. Megadhat egynamed_window
– t, amelyet a lekérdezés határoz meg, vagy lehetmeghatározza az új ablak specifikációit.
Megjegyzések
Ha sem egy megnevezett ablak, sem ablak specifikáció nincs megadva, az allinput sorok minden sor ablakában szerepelnek.
Példák segítségével, hogy a OVER
záradék
Ezek a lekérdezések használata ablak műszaki adatok:
- Számítás összesen
- Számítási egy részösszeg
- Számítási halmozott összeg
- Számítási egy mozgó átlag
- Kiszámolja a tételek száma tartományon belül
- a legnépszerűbb elem az egyes kategóriákban
- az utolsó érték a tartomány
- Számítási rangot
Ezek a lekérdezések használata nevű ablak:
- Szerezd meg az utolsó értéket egy
- tartományba használjon megnevezett ablakot egy ablakkeret záradékban
az ablak specifikációjának meghatározása
window_specification: ] ]
leírás
meghatározza az ablak specifikációit.
-
named_window
: aWINDOW
záradékkal definiált meglévő ablak neve.
-
PARTITION BY
: A bemeneti sorokat külön partíciókra bontja, amely felett az analitikus függvényt függetlenül értékelik.- több partíciós kifejezés megengedett a
PARTITION BY
záradékban. - egy kifejezés nem tartalmazhat lebegőpontos típusokat,nem csoportosítható típusokat, állandókat vagy analitikus funkciókat.
- ha ezt az opcionális záradékot nem használja, akkor a beviteli táblázatban lévő összes soregy partíciót kell létrehoznia.
- több partíciós kifejezés megengedett a
-
ORDER BY
: meghatározza, hogy a sorok hogyan rendeződnek egy partíción belül.Ez a záradék a legtöbb esetben opcionális, de néhány esetben szükségesesesetekben a navigációs funkciókhoz. -
window_frame_clause
: Aggregált analitikusfunkciók esetén meghatározza az ablakkeretet az aktuális partíción belül.Az ablakkeret határozza meg, hogy mit kell tartalmaznia az ablakban.Ha ezt a záradékot használjuk, akkor aORDER BY
szükséges, kivéve a teljes ablakokat.
Megjegyzések
Ha sem a ORDER BY
záradék,sem az ablakkeret záradék nincs jelen, az ablakkeret tartalmazza a partíció összes sorát.
aggregált analitikus függvények esetén, ha a ORDER BY
záradék jelen van, deaz ablakkeret záradék nem, az alábbi ablakkeret záradék alapértelmezés szerint használatban van:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
például a következő lekérdezések egyenértékűek:
SELECT book, LAST_VALUE(item) OVER (ORDER BY year)FROM Library
SELECT book, LAST_VALUE(item) OVER ( ORDER BY year RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)FROM Library
Az ablak specifikációjában egy megnevezett ablak használatára vonatkozó szabályok
- a megnevezett ablakban lévő SPECIFIKÁCIÓK bővíthetőekaz ablak specifikációs záradékában megadott Új specifikációkkal.
- nem lehet redundáns definíciók. Ha van
ORDER BY
Claus a megnevezett ablakban és az ablak specifikációs záradékában, az anerror eldobásra kerül. -
a záradékok sorrendje számít.
PARTITION BY
először jönnie kell,majdORDER BY
éswindow_frame_clause
. Ha hozzáad egy megnevezett ablakot, először az ablak specifikációit dolgozza fel.--this works:SELECT item, purchases, LAST_VALUE(item) OVER (item_window ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING) AS most_popularFROM ProduceWINDOW item_window AS (ORDER BY purchases)--this does not work:SELECT item, purchases, LAST_VALUE(item) OVER (item_window ORDER BY purchases) AS most_popularFROM ProduceWINDOW item_window AS (ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)
-
egy megnevezett ablak és
PARTITION BY
nem jelenhet meg együtt a window specifikációban. HaPARTITION BY
– ra van szüksége, adja hozzá a megnevezett ablakhoz. -
nem hivatkozhat egy megnevezett ablakra egy
ORDER BY
záradékban, egy külső lekérdezésben vagy bármely alkeretben.
Példák segítségével az ablak specifikáció
Ezek a lekérdezések define partíciók egy analitikus függvény:
- Számítási egy részösszeg
- Számítási halmozott összeg
- a legnépszerűbb elem az egyes kategóriákban
- az utolsó érték a tartomány
- Számítási rangot
- egy nevű ablak, ablak keret záradék
Ezek a lekérdezések tartalmazza nevű ablak, ablak specifikáció:
- Szerezd meg az utolsó értéket egy
- tartományba használjon megnevezett ablakot egy ablakkeret záradékban
ezek a lekérdezések határozzák meg, hogy a sorok hogyan rendeződnek egy partícióban:
- Számítási egy részösszeg
- Számítási halmozott összeg
- Számítási egy mozgó átlag
- Kiszámolja a tételek száma tartományon belül
- a legnépszerűbb elem az egyes kategóriákban
- az utolsó érték a tartomány
- Számítási rangot
- Használjon nevű ablak, ablak keret záradék
Meghatározó az ablakkeret záradék
window_frame_clause: { rows_range } { frame_start | frame_between }rows_range: { ROWS | RANGE }frame_between: { BETWEEN unbounded_preceding AND frame_end_a | BETWEEN numeric_preceding AND frame_end_a | BETWEEN current_row AND frame_end_b | BETWEEN numeric_following AND frame_end_c }frame_start: { unbounded_preceding | numeric_preceding | }frame_end_a: { numeric_preceding | current_row | numeric_following | unbounded_following }frame_end_b: { current_row | numeric_following | unbounded_following }frame_end_c: { numeric_following | unbounded_following }unbounded_preceding: UNBOUNDED PRECEDINGnumeric_preceding: numeric_expression PRECEDINGunbounded_following: UNBOUNDED FOLLOWINGnumeric_following: numeric_expression FOLLOWINGcurrent_row: CURRENT ROW
Az ablakkeret záradék meghatározza az ablak keret körül az aktuális sor withina partíció, amely felett az analitikus függvény értékelt.Csak az aggregált analitikus funkciók használhatják az ablakkeret záradékot.
-
rows_range
: olyan záradék, amely fizikai sorokkal rendelkező ablakkeretet határoz megvagy logikai tartomány.-
ROWS
: kiszámítja az ablakkeretet az aktuális sor fizikai eltolásai alapján. Például két sort is tartalmazhat előtt és utánaaz aktuális sor. -
RANGE
: kiszámítja az ablakkeretet az aktuális sor logikai tartománya alapján, az aktuális sorORDER BY
kulcsérték alapján.A megadott tartomány érték hozzáadódik vagy levonásra kerül az aktuális sor ‘ skey értékéhez, hogy meghatározza a kezdő vagy végződő tartományhatárt a window kerethez. Egy tartományalapú ablakkeretben pontosan egynek kell lennieexpresszió aORDER BY
záradékban, a kifejezésnek anumer típusúnak kell lennie.
Tipp: Ha dátumtartományt szeretne használni, használja a
ORDER BY
UNIX_DATE()
függvényt. Ha időbélyeggel rendelkező tartományt szeretne használni, használja aUNIX_SECONDS()
UNIX_MILLIS()
, vagyUNIX_MICROS()
funkciót. -
- határozza meg az ablakkeret elejét
unbounded_preceding
numeric_preceding
numeric_following
vagycurrent_row
.-
unbounded_preceding
: az ablakkeret a partíció elején kezdődik. -
numeric_preceding
vagynumeric_following
: az ablakkeret kezdete a jelenlegi sorhoz viszonyítva van. -
current_row
: az ablakkeret az aktuális sorban kezdődik.
-
- határozza meg az ablakkeret végét
numeric_preceding
numeric_following
current_row
vagyunbounded_following
.-
numeric_preceding
vagynumeric_following
: az ablakkeret vége az aktuális sorhoz viszonyítva van. -
current_row
: Az ablakkeret az aktuális sorban végződik. -
unbounded_following
: az ablakkeret a partíció végén ér véget.
-
-
frame_start
: alsó határral rendelkező ablakkeretet hoz létre.Az ablakkeret az aktuális sorban végződik.-
unbounded_preceding
: az ablakkeret a partíció elején kezdődik. -
numeric_preceding
: az ablakkeret kezdete a jelenlegi sorhoz viszonyítva van. -
current_row
: az ablakkeret az aktuális sorban kezdődik.
-
-
numeric_expression
: egy numerikus típust ábrázoló kifejezés.A numerikus kifejezésnek állandó, nem negatív integeror paraméternek kell lennie.
frame_between
: alsó és felső határral rendelkező ablakkeretet hoz létre.Az első határ az alsó határ. A második határjelzi a felső határt. Csak bizonyos határkombinációk lehetnekhasznált, amint azt az előző szintaxis mutatja.
Megjegyzések
Ha egy határ túlnyúlik a partíció elején vagy végén,az ablakkeret csak sorokat tartalmaz a partíción belül.
nem használhat ablakkeret záradékot anavigációs funkciókkal ésnumbering funkciókkal, mint például a RANK()
.
példák az ablakkeret záradékával
Ezek a lekérdezések ROWS
:
- Számítási halmozott összeg
- Számítási egy mozgó átlag
- a legnépszerűbb elem az egyes kategóriákban
- az utolsó érték a tartomány
- egy nevű ablak, ablak keret záradék
Ezek a lekérdezések számítási értékek RANGE
:
- Kiszámolja a tételek száma tartományon belül
Ezek a lekérdezések számítási értékek a részben vagy teljesen kötetlen ablak:
- Számítás összesen
- Számítási egy részösszeg
- Számítási halmozott összeg
- a legnépszerűbb elem az egyes kategóriákban
- Számítási rangot
Ezek a lekérdezések számítási értékeket a numerikus határok:
- Számítási halmozott összeg
- Számítási egy mozgó átlag
- Kiszámolja a tételek száma tartományon belül
- az utolsó érték a tartomány
- egy nevű ablak, ablak keret záradék
Ezek a lekérdezések számítási értékek az aktuális sor, mint a határ:
- Számítás összesen
- Számítási egy részösszeg
- Számítási halmozott összeg
Hivatkozás nevű ablak
SELECT query_expr, analytic_function_name ( ) OVER over_clauseFROM from_itemWINDOW named_window_expression over_clause: { named_window | ( ) }window_specification: ] ] named_window_expression: named_window AS { named_window | ( ) }
A nevű ablak, egy csoportot képvisel a sorok egy táblázat, ami alapján használja ananalytic funkció. A megnevezett ablak aWINDOW
pontban van definiálva, és az Inan analitikus függvény OVER
clause.In egy OVER
záradék, egy megnevezett ablak megjelenhet önmagában vagy beágyazvaablakspecifikációban.
példák
- Szerezd meg az utolsó értéket egy
- tartományba használjon megnevezett ablakot egy ablakkeret záradékban
navigációs funkció fogalmak
navigációs funkciók általában kiszámítanak néhányvalue_expression
az ablakkeret egy másik sorában a jelenlegi sorból. AOVER
záradék szintaxisa a navigációs funkciók között változik.
követelmények aOVER
záradék:
-
PARTITION BY
: opcionális. -
ORDER BY
:- Disallowed for
PERCENTILE_CONT
andPERCENTILE_DISC
. - Required for
FIRST_VALUE
LAST_VALUE
NTH_VALUE
LEAD
andLAG
.
- Disallowed for
-
window_frame_clause
:- Disallowed for
PERCENTILE_CONT
PERCENTILE_DISC
LEAD
andLAG
. - Optional for
FIRST_VALUE
LAST_VALUE
, andNTH_VALUE
.
- Disallowed for
minden navigációs funkció esetében az eredmény adattípusa megegyezik avalue_expression
típusával.
számozási funkciókoncepciók
számozási függvények egész értékeket rendelnek minden sorhoz a megadott ablakban lévő pozíciójuk alapján.
példa RANK()
DENSE_RANK()
és ROW_NUMBER()
:
WITH Numbers AS (SELECT 1 as x UNION ALL SELECT 2 UNION ALL SELECT 2 UNION ALL SELECT 5 UNION ALL SELECT 8 UNION ALL SELECT 10 UNION ALL SELECT 10)SELECT x, RANK() OVER (ORDER BY x ASC) AS rank, DENSE_RANK() OVER (ORDER BY x ASC) AS dense_rank, ROW_NUMBER() OVER (ORDER BY x) AS row_numFROM Numbers+---------------------------------------------------+| x | rank | dense_rank | row_num |+---------------------------------------------------+| 1 | 1 | 1 | 1 || 2 | 2 | 2 | 2 || 2 | 2 | 2 | 3 || 5 | 4 | 3 | 4 || 8 | 5 | 4 | 5 || 10 | 6 | 5 | 6 || 10 | 6 | 5 | 7 |+---------------------------------------------------+
RANK()
: X = 5 esetén a rank
4, mivel RANK()
az előző ablakrendelési csoportban lévő társak számának növekedése.DENSE_RANK()
: x=5, dense_rank
3, mivel DENSE_RANK()
alwaysincrements by 1, never skipping a value.ROW_NUMBER()
: x=5, row_num
is 4.aggregált analitikus függvényfogalmak
az aggregált függvény olyan függvény, amely az értékek aset-jén számítást végez. A legtöbb aggregált funkció ananalitikus funkcióban használható. Ezeket az aggregált funkciókat nevezikgregálja az analitikus funkciókat.
aggregált analitikus függvények esetén a OVER
záradékot csatolják a függvényhíváshoz; a függvényhívás szintaxisa egyébként változatlan marad.Az aggregált függvény társaikhoz hasonlóan ezek az analitikus függvények is végrehajtanakgregációk, de kifejezetten az egyes sorok megfelelő ablakkerete felett.Ezeknek az analitikus függvényeknek az eredményadattípusai megegyeznek a függvény társaival.
analitikus függvény példák
ezekben a példákban a kiemelt elem az aktuális sor. A boldeditems azok a sorok, amelyek szerepelnek az elemzésben.
a példákban használt közös táblázatok
a következő táblázatokat használják a következő összesített analitikai példákban: Produce
Employees
és Farm
.
néhány példa a Produce
:
WITH Produce AS (SELECT 'kale' as item, 23 as purchases, 'vegetable' as category UNION ALL SELECT 'orange', 2, 'fruit' UNION ALL SELECT 'cabbage', 9, 'vegetable' UNION ALL SELECT 'apple', 8, 'fruit' UNION ALL SELECT 'leek', 2, 'vegetable' UNION ALL SELECT 'lettuce', 10, 'vegetable')SELECT * FROM Produce+-------------------------------------+| item | category | purchases |+-------------------------------------+| kale | vegetable | 23 || orange | fruit | 2 || cabbage | vegetable | 9 || apple | fruit | 8 || leek | vegetable | 2 || lettuce | vegetable | 10 |+-------------------------------------+
néhány példa a Employees
:
WITH Employees AS (SELECT 'Isabella' as name, 2 as department, DATE(1997, 09, 28) as start_date UNION ALL SELECT 'Anthony', 1, DATE(1995, 11, 29) UNION ALL SELECT 'Daniel', 2, DATE(2004, 06, 24) UNION ALL SELECT 'Andrew', 1, DATE(1999, 01, 23) UNION ALL SELECT 'Jacob', 1, DATE(1990, 07, 11) UNION ALL SELECT 'Jose', 2, DATE(2013, 03, 17))SELECT * FROM Employees+-------------------------------------+| name | department | start_date |+-------------------------------------+| Isabella | 2 | 1997-09-28 || Anthony | 1 | 1995-11-29 || Daniel | 2 | 2004-06-24 || Andrew | 1 | 1999-01-23 || Jacob | 1 | 1990-07-11 || Jose | 2 | 2013-03-17 |+-------------------------------------+
néhány példa a Farm
:
WITH Farm AS (SELECT 'cat' as animal, 23 as population, 'mammal' as category UNION ALL SELECT 'duck', 3, 'bird' UNION ALL SELECT 'dog', 2, 'mammal' UNION ALL SELECT 'goose', 1, 'bird' UNION ALL SELECT 'ox', 2, 'mammal' UNION ALL SELECT 'goat', 2, 'mammal')SELECT * FROM Farm+-------------------------------------+| animal | category | population |+-------------------------------------+| cat | mammal | 23 || duck | bird | 3 || dog | mammal | 2 || goose | bird | 1 || ox | mammal | 2 || goat | mammal | 2 |+-------------------------------------+
kiszámol egy nagy összeget
Ez a Produce
táblázat összes elemének nagyösszegét számítja.
- (narancs, alma, hagyma, káposzta, saláta, kelkáposzta) = 54 teljes vásárlások
- (narancs, alma, hagyma, káposzta, saláta, kelkáposzta) = 54 teljes vásárlások
- (narancs, alma, hagyma, káposzta, saláta, kelkáposzta) = 54 teljes vásárlások
- (narancs, alma, hagyma, káposzta, saláta, kelkáposzta) = 54 teljes vásárlások
- (narancs, alma, hagyma, káposzta, saláta, kelkáposzta) = 54 teljes vásárlások
- (narancs, alma, hagyma, káposzta, saláta, kelkáposzta) = 54 teljes vásárlások
SELECT item, purchases, category, SUM(purchases) OVER () AS total_purchasesFROM Produce+-------------------------------------------------------+| item | purchases | category | total_purchases |+-------------------------------------------------------+| orange | 2 | fruit | 54 || leek | 2 | vegetable | 54 || apple | 8 | fruit | 54 || cabbage | 9 | vegetable | 54 || lettuce | 10 | vegetable | 54 || kale | 23 | vegetable | 54 |+-------------------------------------------------------+
Számítási egy részösszeg
Ez a kiszámítja egy részösszeg minden kategóriában aProduce
táblázat.
- gyümölcs
- (narancs, alma) = 10 teljes vásárlások
- (narancs, alma) = 10 teljes vásárlások
- növényi
- (hagyma, káposzta, saláta, kelkáposzta) = 44 teljes vásárlások
- (hagyma, káposzta, saláta, kelkáposzta) = 44 teljes vásárlások
- (hagyma, káposzta, saláta, kelkáposzta) = 44 teljes vásárlások
- (hagyma, káposzta, saláta, kelkáposzta) = 44 teljes vásárlások
SELECT item, purchases, category, SUM(purchases) OVER ( PARTITION BY category ORDER BY purchases ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS total_purchasesFROM Produce+-------------------------------------------------------+| item | purchases | category | total_purchases |+-------------------------------------------------------+| orange | 2 | fruit | 10 || apple | 8 | fruit | 10 || leek | 2 | vegetable | 44 || cabbage | 9 | vegetable | 44 || lettuce | 10 | vegetable | 44 || kale | 23 | vegetable | 44 |+-------------------------------------------------------+
Számítási halmozott összeg
Ez a kiszámítja a halmozott összeg minden kategóriában aProduce
táblázat. Az összeget a ORDER BY
záradék alapján definiált teoreder alapján számítják ki.
- gyümölcs
- (narancs, alma) = 2 teljes vásárlások
- (narancs, alma) = 10 teljes vásárlások
- növényi
- (hagyma, káposzta, saláta, kelkáposzta) = 2 teljes vásárlások
- (hagyma, káposzta, saláta, kelkáposzta) = 11 teljes vásárlások
- (hagyma, káposzta, saláta, kelkáposzta) = 21 teljes vásárlások
- (hagyma, káposzta, saláta, kelkáposzta) = 44 teljes vásárlások
SELECT item, purchases, category, SUM(purchases) OVER ( PARTITION BY category ORDER BY purchases ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS total_purchasesFROM Produce+-------------------------------------------------------+| item | purchases | category | total_purchases |+-------------------------------------------------------+| orange | 2 | fruit | 2 || apple | 8 | fruit | 10 || leek | 2 | vegetable | 2 || cabbage | 9 | vegetable | 11 || lettuce | 10 | vegetable | 21 || kale | 23 | vegetable | 44 |+-------------------------------------------------------+
Ez nem ugyanaz, mint az előző példában. Nem kell hozzáCURRENT ROW
mint egy határ, kivéve, ha azt szeretné, hogy az olvashatóság.
SELECT item, purchases, category, SUM(purchases) OVER ( PARTITION BY category ORDER BY purchases ROWS UNBOUNDED PRECEDING ) AS total_purchasesFROM Produce
ebben a példában a Produce
táblázat összes eleme szerepela partícióban. Csak az előző sorokat elemezzük. Az elemzés kettővel kezdődika partíció aktuális sora előtt.
- (narancs, hagyma, alma, káposzta, saláta, kelkáposzta) = NULL
- (narancs, hagyma, alma, káposzta, saláta, kelkáposzta) = NULL
- (narancs, hagyma, alma, káposzta, saláta, kelkáposzta) = 2
- (narancs, hagyma, alma, káposzta, saláta, kelkáposzta) = 4
- (narancs, hagyma, alma, káposzta, saláta, kelkáposzta) = 12
- (narancs, hagyma, alma, káposzta, saláta, kelkáposzta) = 21
SELECT item, purchases, category, SUM(purchases) OVER ( ORDER BY purchases ROWS BETWEEN UNBOUNDED PRECEDING AND 2 PRECEDING ) AS total_purchasesFROM Produce;+-------------------------------------------------------+| item | purchases | category | total_purchases |+-------------------------------------------------------+| orange | 2 | fruit | NULL || leek | 2 | vegetable | NULL || apple | 8 | fruit | 2 || cabbage | 9 | vegetable | 4 || lettuce | 10 | vegetable | 12 || kale | 23 | vegetable | 21 |+-------------------------------------------------------+
Számítási egy mozgó átlag
Ez a kiszámítja egy mozgó átlag, a Produce
táblázat.Az alsó határ 1 sor a jelenlegi sor előtt. A felső határ 1 sor az aktuális sor után.
- (narancs, hagyma, alma, káposzta, saláta, kelkáposzta) = 2 átlagos vásárlások
- (narancs, hagyma, alma, káposzta, saláta, kelkáposzta) = 4 átlag vásárlások
- (narancs, hagyma, alma, káposzta, saláta, kelkáposzta) = 6.3333 átlagos vásárlások
- (narancs, hagyma, alma, káposzta, saláta, kelkáposzta) = 9 átlagos vásárlások
- (narancs, hagyma, alma, káposzta, saláta, kelkáposzta) = 14 átlagos vásárlások
- (narancs, hagyma, alma, káposzta, saláta, kelkáposzta) = 16.5 átlagos vásárlások
SELECT item, purchases, category, AVG(purchases) OVER ( ORDER BY purchases ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS avg_purchasesFROM Produce+-------------------------------------------------------+| item | purchases | category | avg_purchases |+-------------------------------------------------------+| orange | 2 | fruit | 2 || leek | 2 | vegetable | 4 || apple | 8 | fruit | 6.33333 || cabbage | 9 | vegetable | 9 || lettuce | 10 | vegetable | 14 || kale | 23 | vegetable | 16.5 |+-------------------------------------------------------+
kiszámítja a tételek száma tartományban
Ez a példa megkapja az állatok száma, amelyek hasonló populációszámla aFarm
táblázat.
- (liba, kutya, ökör, kecske, kacsa, macska) = 4 állat 0-2 populációs tartomány között.
- (liba, kutya, ökör, kecske, kacsa, macska) = 5 állat 1-3 populációs tartomány között.
- (liba, kutya, ökör, kecske, kacsa, macska) = 5 állat 1-3 populációs tartomány között.
- (liba, kutya, ökör, kecske, kacsa, macska) = 5 állat 1-3 populációs tartomány között.
- (liba, kutya, ökör, kecske, kacsa, macska) = 4 állat 2-4 populációs tartomány között.
- (liba, kutya, ökör, kecske, kacsa, macska) = 1 állat 22-24 populációs tartomány között.
SELECT animal, population, category, COUNT(*) OVER ( ORDER BY population RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS similar_populationFROM Farm;+----------------------------------------------------------+| animal | population | category | similar_population |+----------------------------------------------------------+| goose | 1 | bird | 4 || dog | 2 | mammal | 5 || ox | 2 | mammal | 5 || goat | 2 | mammal | 5 || duck | 3 | bird | 4 || cat | 23 | mammal | 1 |+----------------------------------------------------------+
Szerezd meg az egyes kategóriák legnépszerűbb tételét
Ez a példa az egyes kategóriák legnépszerűbb elemét kapja. Meghatározza, hogy egy ablak sorai hogyan vannak felosztva és rendezve az egyes partíciókban. AProduce
táblázat hivatkozik.
- gyümölcs
- (narancs, alma) = az apple legnépszerűbb
- (narancs, alma) = az apple legnépszerűbb
- növényi
- (hagyma, káposzta, saláta, kelkáposzta) = kelkáposzta legnépszerűbb
- (hagyma, káposzta, saláta, kelkáposzta) = a kelkáposzta legnépszerűbb
- (hagyma, káposzta, saláta, kelkáposzta) = kelkáposzta legnépszerűbb
- (hagyma, káposzta, saláta, kelkáposzta) = a kelkáposzta legnépszerűbb
SELECT item, purchases, category, LAST_VALUE(item) OVER ( PARTITION BY category ORDER BY purchases ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS most_popularFROM Produce+----------------------------------------------------+| item | purchases | category | most_popular |+----------------------------------------------------+| orange | 2 | fruit | apple || apple | 8 | fruit | apple || leek | 2 | vegetable | kale || cabbage | 9 | vegetable | kale || lettuce | 10 | vegetable | kale || kale | 23 | vegetable | kale |+----------------------------------------------------+
az utolsó érték a tartomány
Ez a példa lesz a legnépszerűbb elem az adott ablak keret is kapunk Produce
asztal. Az ablakkeret legfeljebb három elemzést végezegy időben. Vessen egy pillantást a zöldségekmost_popular
oszlopára.Ahelyett, hogy a legnépszerűbb elem egy adott kategóriában, ez lesz themost népszerű elem egy adott tartományban ebben a kategóriában.
- gyümölcs
- (narancs, alma) = az apple legnépszerűbb
- (narancs, alma) = az apple legnépszerűbb
- növényi
- (hagyma, káposzta, saláta, kelkáposzta) = káposzta legnépszerűbb
- (hagyma, káposzta, saláta, kelkáposzta) = saláta legnépszerűbb
- (hagyma, káposzta, saláta, kelkáposzta) = kelkáposzta legnépszerűbb
- (hagyma, káposzta, saláta, kelkáposzta) = kelkáposzta legnépszerűbb
SELECT item, purchases, category, LAST_VALUE(item) OVER ( PARTITION BY category ORDER BY purchases ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS most_popularFROM Produce+----------------------------------------------------+| item | purchases | category | most_popular |+----------------------------------------------------+| orange | 2 | fruit | apple || apple | 8 | fruit | apple || leek | 2 | vegetable | cabbage || cabbage | 9 | vegetable | lettuce || lettuce | 10 | vegetable | kale || kale | 23 | vegetable | kale |+----------------------------------------------------+
Ez a példa ugyanazt az eredményt adja, mint az előző példában, de kis nevű ablak úgynevezett item_window
. Néhány ablak specifikáció közvetlenül a OVER
záradékban van meghatározva, néhány pedig a megnevezett ablakban van meghatározva.
SELECT item, purchases, category, LAST_VALUE(item) OVER ( item_window ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS most_popularFROM ProduceWINDOW item_window AS ( PARTITION BY category ORDER BY purchases)
számítási rang
Ez a példa kiszámítja az egyes alkalmazottak rangját a részlegükön belül,a kezdő dátum alapján. Az ablak specifikációja közvetlenül meg van határozvaaz OVER
záradékban. AEmployees
táblázat hivatkozik.
- osztály 1
- (Jacob, Anthony, Andrew) = Rendel, rang 1 Jacob
- (Jacob, Anthony, Andrew) = Hozzárendelése rank 2 Anthony
- (Jacob, Anthony, Andrew) = Rendel, rang 3 Andrew
- osztály 2
- (Isabella, Daniel, Jose) = Rendel, rang 1 Isabella
- (Isabella, Daniel, Jose) = Hozzárendelése rank 2 Daniel
- (Isabella, Daniel, Jose) = Rendel, rang 3 Jose
SELECT name, department, start_date, RANK() OVER (PARTITION BY department ORDER BY start_date) AS rankFROM Employees;+--------------------------------------------+| name | department | start_date | rank |+--------------------------------------------+| Jacob | 1 | 1990-07-11 | 1 || Anthony | 1 | 1995-11-29 | 2 || Andrew | 1 | 1999-01-23 | 3 || Isabella | 2 | 1997-09-28 | 1 || Daniel | 2 | 2004-06-24 | 2 || Jose | 2 | 2013-03-17 | 3 |+--------------------------------------------+
egy nevű ablak, ablak keret záradék
megadhatjuk a logika egy nevű ablakban, s egy részét a awindow frame záradék. Ez a logika kombinálódik. Itt van egy példa aProduce
táblázat használatával.
SELECT item, purchases, category, LAST_VALUE(item) OVER (item_window) AS most_popularFROM ProduceWINDOW item_window AS ( PARTITION BY category ORDER BY purchases ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)+-------------------------------------------------------+| item | purchases | category | most_popular |+-------------------------------------------------------+| orange | 2 | fruit | apple || apple | 8 | fruit | apple || leek | 2 | vegetable | lettuce || cabbage | 9 | vegetable | kale || lettuce | 10 | vegetable | kale || kale | 23 | vegetable | kale |+-------------------------------------------------------+
az előző eredményeket ezekkel a példákkal is megkaphatja:
SELECT item, purchases, category, LAST_VALUE(item) OVER (item_window) AS most_popularFROM ProduceWINDOW a AS (PARTITION BY category), b AS (a ORDER BY purchases), c AS (b ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING), item_window AS (c)
SELECT item, purchases, category, LAST_VALUE(item) OVER (item_window ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING) AS most_popularFROM ProduceWINDOW a AS (PARTITION BY category), b AS (a ORDER BY purchases), item_window AS (b)
a következő példa hibát okoz, mivel az ablakkeret záradék kétszer lett definiálva:
SELECT item, purchases, category, LAST_VALUE(item) OVER ( item_window ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS most_popularFROM ProduceWINDOW item_window AS ( ORDER BY purchases ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)
Leave a Reply