Analytické funkce pojmů v Normě SQL
analytické funkce vypočítá hodnoty skupiny řádků a vrací jeden výsledek pro každý řádek. To se liší od funkce agregace, která vrací jediný výsledek pro skupinu řádků.
analytická funkce obsahuje klauzuli OVER
, která definuje okno řádků kolem hodnoceného řádku. Pro každý řádek je výsledek analytické funkceje vypočtena pomocí vybraného okna řádků jako vstupu, případně agregace.
s analytickými funkcemi můžete vypočítat klouzavé průměry, řadit položky, vypočítat kumulativní částky a provádět další analýzy.
následující funkce mohou být použity jak analytické funkce:navigační funkce,číslování funkce, andaggregate analytické funkce
Analytické funkce syntaxe
analytic_function_name ( ) OVER over_clauseover_clause: { named_window | ( ) }window_specification: ] ] window_frame_clause: { rows_range } { frame_start | frame_between }rows_range: { ROWS | RANGE }
Notace, pravidel,
- hranaté závorky „“ označují nepovinné doložky.
- závorky „() “ označují doslovné závorky.
- svislá čára “ | “ označuje logické nebo.
- Curly braces „{ } “ přiložte sadu možností.
- čárka následovaná elipsou v hranatých závorkách „“ označuje, žepředchozí položka se může opakovat v seznamu odděleném čárkami.
popis
analytická funkce vypočítá výsledky nad skupinou řádků. Můžete použít následující syntaxi vybudovat analytické funkce:
-
analytic_function_name
: funkce, která provádí analytické operace.Zde lze použít například funkci číslováníRANK()
. -
argument_list
: argumenty, které jsou specifické pro analytickou funkci.Některé funkce je mají, některé ne. -
OVER
: Klíčové slovo požadované v syntaxi analytické funkce předcházejícíOVER
klauzule. -
over_clause
: Odkazuje na okno, které definuje skupinu řádků v tabulce, na které chcete použít analytické funkce. -
window_specification
: definuje specifikace pro okno. -
window_frame_clause
: definuje rámec okna pro okno. -
rows_range
: definuje fyzické řádky nebo alogický rozsah pro rám okna.
Poznámky
analytické funkce může jevit jako skalární výraz operand ve dvou místech v dotazu:
-
SELECT
seznam. Pokud se analytická funkce objeví vSELECT
list, její seznam argumentů aOVER
nemohou odkazovat na aliasy zavedené ve stejném seznamu SELECT. - klauzule
ORDER BY
. Pokud se analytická funkce objeví v klauzuliORDER BY
dotazu, může její seznam argumentů odkazovat naSELECT
aliasy seznamu.
analytická funkce nemůže odkazovat na jinou analytickou funkci v seznamu itsargument nebo na klauzuli OVER
, a to ani nepřímo prostřednictvím aliasu.
analytická funkce je vyhodnocena po agregaci. Například klauzuleGROUP BY
a neanalytické agregační funkce jsou vyhodnoceny jako první.Protože agregované funkce jsou vyhodnocovány před analytickými funkcemi, agregované funkce mohou být použity jako vstupní operandy do analytických funkcí.
vrací
jeden výsledek pro každý řádek ve vstupu.
Definující VÍCE ustanovení
analytic_function_name ( ) OVER over_clauseover_clause: { named_window | ( ) }
Popis
OVER
klauzule odkazy okno, které definuje skupinu řádků v tableupon, který chcete použít analytické funkce. Můžete zadatnamed_window
, který je definován ve vašem dotazu, nebo můžetedefinovat specifikace pro nové okno.
poznámky
Pokud není zadáno pojmenované okno ani SPECIFIKACE okna, jsou v okně pro každý řádek zahrnuty řádky allinput.
Příklady použití OVER
bodě,
Tyto dotazy použijte okno specifikace:
- Vypočítat celkový součet
- Vypočítat mezisoučet
- Vypočítat kumulativní součet
- Vypočítat klouzavý průměr
- Počítat počet položek v rozsahu
- Získat co nejvíce populární položka v každé kategorii
- Získat poslední hodnotu v rozsahu
- Výpočet hodnosti
Tyto dotazy použít pojmenované okno:
- Získat poslední hodnotu v rozsahu
- Použití pojmenované okno v rámu okna doložka
Definování okna specifikace
window_specification: ] ]
Popis
Definuje specifikace pro okna.
-
named_window
: název existující okno, které definovala sWINDOW
klauzule.
-
PARTITION BY
: rozdělí vstupní řádky do samostatných oddílů, overwhich analytické funkce je nezávisle hodnocena.- v klauzuli
PARTITION BY
je povoleno více výrazů oddílů. - výraz nemůže obsahovat typy s plovoucí desetinnou čárkou, neskupitelné typy, konstanty nebo analytické funkce.
- pokud není tato volitelná klauzule použita, všechny řádky ve vstupní tabulce obsahují jeden oddíl.
- v klauzuli
-
ORDER BY
: definuje pořadí řádků v rámci oddílu.Tato klauzule je ve většině situací volitelná, ale v některých případech je vyžadována pro navigační funkce. -
window_frame_clause
: Pro agregátní analýzufunkce, definuje rámec okna v aktuálním oddílu.Rám okna určuje, co do okna zahrnout.Pokud je tato klauzule použita,ORDER BY
je vyžadováno s výjimkou fullyunbounded windows.
poznámky
Pokud není k dispozici klauzule ORDER BY
ani klauzule window frame, rám okna obsahuje všechny řádky v tomto oddílu.
pro agregátní analytické funkce, pokud je klauzule ORDER BY
přítomna, ale klauzule rám okna není, je ve výchozím nastavení použita následující klauzule rám okna:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
například, následující dotazy jsou ekvivalentní:
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
Pravidla pro používání pojmenované okno v okně specifikace
Pokud používáte pojmenované okno v okně specifikace, platí tato pravidla:
- specifikace v pojmenované okno může být extendedwith nové specifikace, které můžete definovat v okně specifikace doložky.
- nemůžete mít redundantní definice. Pokud máte
ORDER BY
clausv pojmenovaném okně a klauzuli SPECIFIKACE okna, je vyvolána anerror. -
záleží na pořadí klauzulí.
PARTITION BY
musí být na prvním místě, následujeORDER BY
awindow_frame_clause
. Pokud přidáte pojmenované okno, jeho specifikace okna jsou zpracovány jako první.--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)
-
pojmenované okno a
PARTITION BY
se nemohou objevit společně ve specifikaci okna. Pokud potřebujetePARTITION BY
, přidejte jej do pojmenovaného okna. -
nelze odkazovat na pojmenované okno v klauzuli
ORDER BY
, vnějším dotazu nebo jakémkoli poddotazu.
Příklady použití na okna specifikace
Tyto dotazy definovat oddíly v analytické funkce:
- Vypočítat mezisoučet
- Vypočítat kumulativní součet
- Získat co nejvíce populární položka v každé kategorii
- Získat poslední hodnotu v rozsahu
- Výpočet hodnosti
- Použití pojmenované okno v rámu okna doložka
Tyto dotazy patří pojmenované okno v okně specifikace:
- Získat poslední hodnotu v rozsahu
- Použití pojmenované okno v rámu okna doložka
Tyto dotazy definovat, jak řádky jsou řazeny v oddílu:
- Vypočítat mezisoučet
- Vypočítat kumulativní součet
- Vypočítat klouzavý průměr
- Počítat počet položek v rozsahu
- Získat co nejvíce populární položka v každé kategorii
- Získat poslední hodnotu v rozsahu
- Výpočet hodnosti
- Použít pojmenované okno v rámu okna doložka
Definuje rám okna ustanovení
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
rám okna ustanovení definuje rámu okna kolem aktuálního řádku dělí oddíl, přes které analytické funkce je vyhodnocena.Klauzuli rámečku okna mohou používat pouze agregované analytické funkce.
-
rows_range
: klauzule, která definuje rámec okna s fyzickými řádky nebo logickým rozsahem.-
ROWS
: vypočítá rám okna na základě fyzických offsetů z aktuálního řádku. Můžete například zahrnout dva řádky před a poaktuální řádek. -
RANGE
: Vypočítá rámu okna na základě logické řady rowsaround aktuální řádek, na základě aktuální řádekORDER BY
klíčové hodnoty.Zadaná hodnota rozsahu se přičte nebo odečte k aktuální hodnotě řádku, aby se definovala počáteční nebo koncová hranice rozsahu pro rámec okna. V rozsahu-na základě okenního rámu, musí být přesně oneexpression vORDER BY
klauzule, a výraz musí mít číselnou typ.
Tip: Pokud chcete použít rozsah s datem, použijte
ORDER BY
UNIX_DATE()
funkce. Pokud chcete použít rozsah s časové razítko,použítUNIX_SECONDS()
UNIX_MILLIS()
neboUNIX_MICROS()
funkce. -
-
frame_between
: vytvoří rám okna s dolní a horní hranicí.První hranice představuje dolní hranici. Druhá hranicepředstavuje horní hranici. Mohou být použity pouze určité hraniční kombinace, jak ukazuje předchozí syntaxe.- Definovat začátek okenního rámu s
unbounded_preceding
numeric_preceding
numeric_following
nebocurrent_row
.-
unbounded_preceding
: rám okna začíná na začátku části. -
numeric_preceding
nebonumeric_following
: začátek windowframe je relativní k aktuální řádek. -
current_row
: rám okna začíná na aktuálním řádku.
-
- Definovat konci rámu okna pomocí
numeric_preceding
numeric_following
current_row
nebounbounded_following
.-
numeric_preceding
nebonumeric_following
: konec windowframe je relativní k aktuální řádek. -
current_row
: Rám okna končí v aktuálním řádku. -
unbounded_following
: rám okna končí na konci části.
-
- Definovat začátek okenního rámu s
-
frame_start
: vytvoří rám okna s dolní hranicí.Rám okna končí v aktuálním řádku.-
unbounded_preceding
: rám okna začíná na začátku části. -
numeric_preceding
: začátek rámečku okna je relativní k aktuálnímu řádku. -
current_row
: rám okna začíná na aktuálním řádku.
-
-
numeric_expression
: výraz, který představuje číselný Typ.Číselný výraz musí být konstantní, nezáporné celénebo parametr.
poznámky
Pokud hranice přesahuje začátek nebo konec oddílu, rám okna bude obsahovat pouze řádky z tohoto oddílu.
nelze použít klauzuli rámu okna s funkcemi navigace a funkcemi číslování, jako je RANK()
.
příklady použití klauzule rám okna
tyto dotazy počítají hodnoty s ROWS
:
- Vypočítat kumulativní součet
- Vypočítat klouzavý průměr
- Získat co nejvíce populární položka v každé kategorii
- Získat poslední hodnotu v rozsahu
- Použití pojmenované okno v rámu okna doložka
Tyto dotazy vypočítat hodnoty s RANGE
:
- Počítat počet položek v rozsahu
Tyto dotazy vypočítat hodnoty s částečně nebo plně bez závazků okna:
- Vypočítat celkový součet
- Vypočítat mezisoučet
- Vypočítat kumulativní součet
- Získat co nejvíce populární položka v každé kategorii
- Výpočet hodnosti
Tyto dotazy vypočítat hodnoty s číselnými hranice:
- Vypočítat kumulativní součet
- Vypočítat klouzavý průměr
- Počítat počet položek v rozsahu
- Získat poslední hodnotu v rozsahu
- Použití pojmenované okno v rámu okna doložka
Tyto dotazy vypočítat hodnoty s aktuální řádek jako hranice:
- Vypočítat celkový součet
- Vypočítat mezisoučet
- Vypočítat kumulativní součet
Odkazování na pojmenované okno
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 | ( ) }
pojmenované okno představuje skupinu řádků v tabulce, na které chcete použít ananalytic funkce. Pojmenované okno je definována vWINDOW
klauzule, a odkazuje inan analytické funkce je OVER
klauzule.V OVER
klauzule, pojmenované okno se může objevit buď sama, nebo embeddedwithin okno specifikace.
Příklady
- Získat poslední hodnotu v rozsahu
- Použití pojmenované okno v rámu okna doložka
Navigace funkce pojmy
Navigační funkce obecně spočítat párvalue_expression
přes jiný řádek v rámu okna z aktuální řady. Syntaxe klauzule OVER
se v různých navigačních funkcích liší.
Požadavky na OVER
článek:
-
PARTITION BY
: Volitelné. -
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
pro všechny navigační funkce je datový typ výsledku stejný jakovalue_expression
.
koncepty číslovacích funkcí
číslovací funkce přiřazují celočíselné hodnoty každému řádku na základě jejich polohy v zadaném okně.
Příklad RANK()
DENSE_RANK()
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()
: Pro x=5 jerank
4, protožeRANK()
přírůstky počtem vrstevníků v předchozí skupině Řazení oken. -
DENSE_RANK()
: Pro x=5,dense_rank
je 3, protožeDENSE_RANK()
alwaysincrements o 1, nikdy přeskakování hodnotu. -
ROW_NUMBER()
: pro x=5,row_num
je 4.
Souhrnné analytické funkce pojmy
agregační funkce je funkce, která provádí výpočet na soubor hodnot. Většina agregovaných funkcí může být použita v analytické funkci. Tyto souhrnné funkce se nazývajíagregovat analytické funkce.
u agregovaných analytických funkcí je klauzule OVER
připojena k volání funkce; syntaxe volání funkce zůstává jinak nezměněna. Stejně jako jejich protějšky agregovaných funkcí, tyto analytické funkce provádíagregace, ale konkrétně nad příslušným rámečkem okna pro každý řádek.Datové typy výsledků těchto analytických funkcí jsou stejné jako jejich protějšky.
příklady analytické funkce
v těchto příkladech je zvýrazněnou položkou aktuální řádek. Tyto boldeditems jsou řádky, které jsou zahrnuty v analýze.
Společné tabulek používaných v příkladech
V následujících tabulkách jsou použity v následující souhrnné analyticquery příklady: Produce
Employees
Farm
.
Produce table
některé příklady odkazují na tabulku s názvem 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 |+-------------------------------------+
Zaměstnanci tabulka
Některé příklady, referenční tabulku s názvem 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 |+-------------------------------------+
Farmě tabulky
Některé příklady, referenční tabulku s názvem 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 |+-------------------------------------+
Vypočítat celkový součet
Tento vypočítá celkový součet pro všechny položky vProduce
tabulka.
- (pomeranč, jablko, pórek, zelí, hlávkový salát, kapusta) = 54 celkový nákup
- (pomeranč, jablko, pórek, zelí, hlávkový salát, kapusta) = 54 celkový nákup
- (pomeranč, jablko, pórek, zelí, hlávkový salát, kapusta) = 54 celkový nákup
- (pomeranč, jablko, pórek, zelí, hlávkový salát, kapusta) = 54 celkový nákup
- (pomeranč, jablko, pórek, zelí, hlávkový salát, kapusta) = 54 celkový nákup
- (pomeranč, jablko, pórek, zelí, hlávkový salát, kapusta) = 54 celkový nákup
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 |+-------------------------------------------------------+
Vypočítat mezisoučet
Tento vypočítá mezisoučet pro každou kategorii vProduce
tabulka.
- ovoce
- (pomeranč, jablko) = 10 celkový nákup
- (pomeranč, jablko) = 10 celkový nákup
- zelenina
- (pórek, zelí, hlávkový salát, kapusta) = 44 celkem nákupy
- (pórek, zelí, hlávkový salát, kapusta) = 44 celkem nákupy
- (pórek, zelí, hlávkový salát, kapusta) = 44 celkem nákupy
- (pórek, zelí, hlávkový salát, kapusta) = 44 celkem nákupy
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 |+-------------------------------------------------------+
Vypočítat kumulativní součet
To se počítá kumulativní součet pro každou kategorii vProduce
tabulka. Součet je vypočítán s ohledem na pořadí definované pomocí klauzule ORDER BY
.
- ovoce
- (pomeranč, jablko) = 2 celkem nákupy
- (pomeranč, jablko) = 10 celkový nákup
- zelenina
- (pórek, zelí, hlávkový salát, kapusta) = 2 celkem nákupy
- (pórek, zelí, hlávkový salát, kapusta) = 11 celkem nákupy
- (pórek, zelí, hlávkový salát, kapusta) = 21 celková nákupy
- (pórek, zelí, hlávkový salát, kapusta) = 44 celkem nákupy
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 |+-------------------------------------------------------+
To dělá to samé jako předchozí příklad. Nemusíte přidávatCURRENT ROW
jako hranici, pokud nechcete pro čitelnost.
SELECT item, purchases, category, SUM(purchases) OVER ( PARTITION BY category ORDER BY purchases ROWS UNBOUNDED PRECEDING ) AS total_purchasesFROM Produce
V tomto příkladu, všechny položky v Produce
stůl je obsažen v oddílu. Analyzovány jsou pouze předchozí řádky. Analýza začíná dvapřed aktuálním řádkem v oddílu.
- (pomeranč, pórek, jablko, zelí, hlávkový salát, kapusta) = NULL
- (pomeranč, pórek, jablko, zelí, hlávkový salát, kapusta) = NULL
- (pomeranč, pórek, jablko, zelí, hlávkový salát, kapusta) = 2
- (pomeranč, pórek, jablko, zelí, hlávkový salát, kapusta) = 4
- (pomeranč, pórek, jablko, zelí, hlávkový salát, kapusta) = 12
- (pomeranč, pórek, jablko, zelí, hlávkový salát, kapusta) = 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 |+-------------------------------------------------------+
Vypočítat klouzavý průměr
To se počítá klouzavý průměr v Produce
tabulka.Dolní hranice je 1 řádek předtímproudý řádek. Horní hranice je 1 řádek za aktuálním řádkem.
- (pomeranč, pórek, jablko, zelí, hlávkový salát, kapusta) = 2 průměrné nákupy
- (pomeranč, pórek, jablko, zelí, hlávkový salát, kapusta) = 4 průměrné nákupy
- (pomeranč, pórek, jablko, zelí, hlávkový salát, kapusta) = 6.3333 průměrné nákupy
- (pomeranč, pórek, jablko, zelí, hlávkový salát, kapusta) = 9 průměrné nákupy
- (pomeranč, pórek, jablko, zelí, hlávkový salát, kapusta) = 14 průměrné nákupy
- (pomeranč, pórek, jablko, zelí, hlávkový salát, kapusta) = 16.5 průměrné nákupy
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 |+-------------------------------------------------------+
Spočítat počet položek v rozsahu
Tento příklad dostane počet zvířat, která mají podobný populationcount v Farm
tabulka.
- (Husa, pes, vůl, koza, kachna, kočka) = 4 zvířata v populačním rozmezí 0-2.
- (Husa, pes, vůl, koza, kachna, kočka) = 5 zvířat mezi populačním rozsahem 1-3.
- (Husa, pes, vůl, koza, kachna, kočka) = 5 zvířat mezi populačním rozsahem 1-3.
- (Husa, pes, vůl, koza, kachna, kočka) = 5 zvířat mezi populačním rozsahem 1-3.
- (Husa, pes, vůl, koza, kachna, kočka) = 4 Zvířata mezi populačním rozsahem 2-4.
- (Husa, pes, vůl, koza, kachna, kočka) = 1 zvíře mezi populačním rozsahem 22-24.
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 |+----------------------------------------------------------+
získejte nejoblíbenější položku v každé kategorii
Tento příklad získá nejoblíbenější položku v každé kategorii. Definuje, jak rowsin okna jsou rozděleny a seřazeny v každém oddílu. Odkazuje se na tabulkuProduce
.
- ovoce
- (pomeranč, jablko) = apple je nejvíce populární
- (pomeranč, jablko) = apple je nejvíce populární
- zelenina
- (pórek, zelí, hlávkový salát, kapusta) = kapusta je nejpopulárnější
- (pórek, zelí, hlávkový salát, kapusta) = kapusta je nejpopulárnější
- (pórek, zelí, hlávkový salát, kapusta) = kapusta je nejpopulárnější
- (pórek, zelí, hlávkový salát, kapusta) = kapusta je nejpopulárnější
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 |+----------------------------------------------------+
poslední hodnota v rozmezí
Tento příklad dostane nejvíce populární položka v konkrétní rám okna pomocí Produce
tabulka. Rám okna analyzuje až tři stupně najednou. Podívejte se blíže na sloupec most_popular
pro zeleninu.Místo získání nejoblíbenější položky v konkrétní kategorii, získávánejoblíbenější položky v určitém rozsahu v této kategorii.
- ovoce
- (pomeranč, jablko) = apple je nejvíce populární
- (pomeranč, jablko) = apple je nejvíce populární
- zelenina
- (pórek, zelí, hlávkový salát, kapusta) = zelí je velmi populární
- (pórek, zelí, hlávkový salát, kapusta) = hlávkový salát je nejvíce populární
- (pórek, zelí, hlávkový salát, kapusta) = kapusta je nejpopulárnější
- (pórek, zelí, hlávkový salát, kapusta) = kapusta je nejpopulárnější
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 |+----------------------------------------------------+
Tento příklad vrátí stejné výsledky jako předchozí příklad, ale to includesa pojmenované okno se nazývá item_window
. Některé specifikace okna jsoudefinováno přímo v klauzuli OVER
a některé jsou definovány v pojmenovaném okně.
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)
Compute rank
tento příklad vypočítá hodnost každého zaměstnance v rámci svého oddělení na základě data zahájení. SPECIFIKACE okna je definována přímov klauzuli OVER
. Je odkazováno na Employees
tabulku.
- oddělení 1
- (Jacob, Anthony, Andrew) = Přiřadit hodnost 1 až Jacob
- (Jacob, Anthony, Andrew) = Přiřadit hodnost 2-Anthony
- (Jacob, Anthony, Andrew) = Přiřadit hodnost 3 Andrewa
- oddělení 2
- (Isabella, Daniel, Jose) = Přiřadit hodnost 1 až Isabella
- (Isabella, Daniel, Jose) = Přiřadit hodnost 2 pro Daniel
- (Isabella, Daniel, Jose) = Přiřadit hodnost 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 |+--------------------------------------------+
Použití pojmenované okno v rámu okna ustanovení
můžete definovat nějaké své logiky, v pojmenované okno a některé z nich v klauzule awindow frame. Tato logika je kombinována. Zde je příklad pomocí tabulkyProduce
.
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 |+-------------------------------------------------------+
můžete také získat předchozí výsledky s těmito příklady:
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)
následující příklad vytváří chybu, protože rám okna klauzule má beendefined dvakrát:
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