Klauzule SQL OVER () – kdy a proč je to užitečné?

Takže jednoduše řečeno: Klauzuli Over lze použít k výběru neagregovaných hodnot spolu s agregovanými.

Partition BY, ORDER BY inside, and ROWS or RANGE are part of OVER () by clause.

partition by se používá k rozdělení dat a následnému provedení těchto oken, agregovaných funkcí, a pokud nebudeme t mít oddíl do té doby celá sada výsledků je považována za jeden oddíl.

Nechť „Zobrazit základní syntaxi klauzule OVER

PARTITION BY: Používá se k rozdělení dat a provádění operací na skupinách se stejnými daty.

ORDER BY: Používá se k definování logického pořadí dat v oddílech. Když neurčíme oddíl, celá výsledková sada je považována za jeden oddíl.

: To lze použít k určení, jaké řádky se mají v oddílu při provádění operace považovat.

Pojďme si vzít příklad:

Tady je moje datová sada:

Takže dovolte mi provést různé scénáře a podívat se, jak jsou ovlivněna data a já budu vycházet z obtížné syntaxe k jednoduché jedna

Stačí pozorovat část sum_sal. Zde používám objednávku podle Platu a používám „ROZSAH MEZI NEBEZPEČNÝM PŘEDCHOZÍM A AKTUÁLNÍM ŘADEM“. V tomto případě nepoužíváme oddíl, takže celá data budou považována za jeden oddíl a my objednáváme na platu. A důležitá je zde NEBEZPEČNÁ PŘEDCHOZÍ A AKTUÁLNÍ ŘADA. To znamená, když počítáme součet, od počátečního řádku po aktuální řádek pro každý řádek. Ale pokud vidíme řádky s platem 5000 a názvem = „Pavan“, v ideálním případě by to mělo být 17000 a pro plat = 5000 a jméno = Mark by to mělo být 22000. Ale protože používáme RANGE a v tomto případě, pokud najde nějaké s imilar elements pak je považuje za stejnou logickou skupinu a provede s nimi operaci a přiřadí hodnotu každé položce v této skupině. To je důvod, proč máme stejnou hodnotu platu = 5000. Motor se zvýšil na plat = 5000 a Jméno = Ron a vypočítal součet a poté jej přidělil všem plat = 5000.

Takže s ŘÁDKY MEZI NEBEZPEČNÝMI PŘEDCHOZÍMI A AKTUÁLNÍMI ŘÁDKY Rozdíl platí pro položky stejné hodnoty seskupit je dohromady, spočítá SUM od počátečního řádku k aktuálnímu a nezpracovává položky se stejnou hodnotou odlišně jako RANGE

Tyto výsledky jsou stejné jako

Je to proto, že Over (objednávka podle platu) je jen zkratka z Over (objednávka podle platu RANGE MEZI NEBEZPEČNÝM PRECEDINGEM A AKTUÁLNÍM ŘADEM) Takže kdekoli jednoduše zadáme Order by without ROWS or RANGE it is taking ROZSAH MEZI NEBEZPEČNÝM PŘEDCHOZÍM A AKTUÁLNÍM ŘÁDKEM jako výchozí.

Poznámka: Toto platí pouze pro funkce, které ve skutečnosti přijímají RANGE / ROW. Například ROW_NUMBER a několik dalších nepřijímá RANGE / ROW a v takovém případě , to nepřijde do obrazu.

Až dosud jsme viděli, že klauzule Over s objednávkou podle bere Range / ROWS a syntaxe vypadá nějak hing like this RANGE MEZI NEBEZPEČNÝM PŘEDCHOZÍM A AKTUÁLNÍM ŘADEM A ve skutečnosti se počítá až k aktuálnímu řádku z prvního řádku. Ale co Když chce vypočítat hodnoty pro celý oddíl dat a mít je pro každý sloupec (tj. Od 1. řádku po poslední řádek). Tady je dotaz na to.

Místo AKTUÁLNÍHO ŘÁDKU zadávám NEBEZPEČNÉ SLEDOVÁNÍ, které dává motoru pokyn k výpočtu až do posledního záznamu oddílu pro každý řádek.

Nyní přichází váš poukazují na to, co je OVER () s prázdnými složenými závorkami?

Je to jen zkratka pro Over (objednávka podle platu ŘADY MEZI BEZOBRANÝMI PŘEDCHOZÍMI A BEZOBRANÝMI NÁSLEDUJÍCÍMI)

Zde nepřímo určujeme zacházet se všemi mými výsledky jako s jedním oddílem a poté provádět výpočty od prvního záznamu po poslední záznam každého oddílu.

Vytvořil jsem k tomu video a pokud vás zajímá, můžete jej navštívit. https://www.youtube.com/watch?v=CvVenuVUqto&t=1177s

Díky, Pavan Kumar AryasomayajuluHTTP: //xyzcoder.github.io

Write a Comment

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *