Articles

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í v SELECT list, její seznam argumentů a OVER nemohou odkazovat na aliasy zavedené ve stejném seznamu SELECT.
  • klauzuleORDER BY. Pokud se analytická funkce objeví v klauzuli ORDER BY dotazu, může její seznam argumentů odkazovat na SELECT 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 s WINDOW 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.
  • 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ásleduje ORDER BY a window_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řebujete PARTITION 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í řádek ORDER 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 v ORDER BY klauzule, a výraz musí mít číselnou typ.

    Tip: Pokud chcete použít rozsah s datem, použijte ORDER BYUNIX_DATE() funkce. Pokud chcete použít rozsah s časové razítko,použít UNIX_SECONDS()UNIX_MILLIS() nebo UNIX_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_precedingnumeric_precedingnumeric_following nebo current_row.
      • unbounded_preceding: rám okna začíná na začátku části.
      • numeric_preceding nebo numeric_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_precedingnumeric_followingcurrent_row nebo unbounded_following.
      • numeric_preceding nebo numeric_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.
  • 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:
    1. Disallowed for PERCENTILE_CONT and PERCENTILE_DISC.
    2. Required for FIRST_VALUELAST_VALUENTH_VALUELEADand LAG.
  • window_frame_clause:
    1. Disallowed for PERCENTILE_CONTPERCENTILE_DISCLEAD and LAG.
    2. Optional for FIRST_VALUELAST_VALUE, and NTH_VALUE.

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 je rank 4, protože RANK() přírůstky počtem vrstevníků v předchozí skupině Řazení oken.
  • DENSE_RANK(): Pro x=5, dense_rank je 3, protože DENSE_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: ProduceEmployeesFarm.

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)