Je zvláště užitečné, když potřebujete vypočítat agregace nebo hodnocení pro skupiny řádků, aniž byste ve skutečnosti sbalili celou sadu výsledků.
Připojte se k nám v tomto tutoriálu, kde se naučíme vše, co je potřeba vědět, abyste mohli začít pracovat s klauzulí OVER.
Požadavky:
Než se ponoříme do funkčnosti a fungování klauzule OVER, ujistěte se, že máte základy SQL z cesty. Předpokládáme také, že máte přístup k databázi, kterou můžete použít k otestování svých znalostí.
V našem případě použijeme databázi MySQL se vzorovou databází Sakila. Jen se ujistěte, že máte dostatečná oprávnění a že váš databázový stroj podporuje funkce okna.
Syntax:
Jak jsme uvedli dříve, ve většině případů používáme ve spojení s funkcemi okna hlavně klauzuli OVER.
Jako takovou můžeme syntaxi klauzule vyjádřit takto:
[PARTITION BY partition_expression, ...]
[ORDER BY sort_expression [ASC | DESC], ...]
[frame_specifikace]
)
V dané syntaxi můžeme jednotlivé komponenty rozdělit takto:
-
– odkazuje na funkci okna, kterou chceme použít v konkrétním okně řádků, jako je SUM(), AVG(), ROW_NUMBER(), RANK atd. - Výraz – Určuje sloupec nebo výraz, pro který se použije funkce okna.
- PARTITION BY – Toto je volitelná klauzule, která rozděluje sadu výsledků do oddílů, kde každý oddíl je jako samostatná jednotka, kde je funkce aplikována. Řádky ve stejném oddílu sdílejí stejné hodnoty v určených sloupcích.
- ORDER BY – Určuje pořadí, ve kterém jsou zpracovány řádky v každém oddílu.
- specifikace_rámce – Toto je volitelná klauzule, která definuje rámec řádků v oddílu. Mezi běžné specifikace rámce patří ŘÁDKY BETWEEN
AND nebo RANGE BETWEEN AND
S tím mimo, pojďme prozkoumat několik praktických příkladů, jak to používat.
Příklad:
Ukažme si, jak používat klauzuli pomocí ukázkové databáze Sakila. Zvažte příklad, kdy potřebujeme určit celkový příjem pro každou kategorii filmu.
Můžeme použít funkci součtového okna s klauzulí OVER a hromadou příkazů spojení, jak ukazuje následující příklad:
VYBRATcategory.name AS název_kategorie,
film.title AS název_filmu,
film.rental_rate,
SUM(platba.částka) NAD (PARTITION BY category.name) JAKO celkový_výnos
Z
film
PŘIPOJIT
Film_category ON
film.film_id = film_kategorie.film_id
PŘIPOJIT
kategorie ON
film_category.category_id = category.category_id
PŘIPOJIT
inventář ZAP
film.film_id = inventář.film_id
PŘIPOJIT
pronájem ON
inventar.inventory_id = pronájem.id_inventory
PŘIPOJIT
platba ON
rent.rental_id = payment.rental_id
SEŘADIT PODLE
Název Kategorie,
film.název;
V daném dotazu začneme výběrem názvu filmu, sazby půjčovného a pomocí výrazu suma (platba.částka přes oddíl podle názvu kategorie) určíme součet každého oddílu kategorie podle názvu kategorie.
Musíme použít klauzuli PARTITION BY, abychom zajistili, že výpočet součtu bude restartován u každé jedinečné kategorie.
Výsledný výstup je následující:
Tady to máš!
Závěr
V tomto příkladu jsme prozkoumali základy práce s klauzulí OVER v SQL. Toto není základní klauzule a vyžaduje předchozí znalost dalších funkcí SQL.