analytische functieconcepten in standaard SQL
een analytische functie berekent waarden over een groep rijen en retourneert een enkel resultaat voor elke rij. Dit verschilt van een aggregaatfunctie, die een enkel resultaat voor een groep rijen retourneert.
een analytische functie bevat eenOVER
clausule, die een venster van rijen definieert rond de rij die wordt geëvalueerd. Voor elke rij wordt het resultaat van de analytische functie berekend met behulp van het geselecteerde venster van rijen als invoer, mogelijkdoing aggregatie.
met analytische functies kunt u voortschrijdende gemiddelden berekenen, items rangschikken, sommen berekenen en andere analyses uitvoeren.
de volgende functies kunnen als analytische functies worden gebruikt:navigatiefuncties, nummering, en aggregate analytische functies
analytische functie syntaxis
analytic_function_name ( ) OVER over_clauseover_clause: { named_window | ( ) }window_specification: ] ] window_frame_clause: { rows_range } { frame_start | frame_between }rows_range: { ROWS | RANGE }
Notatieregels
- vierkante haakjes “” geven optionele clausules aan.
- haakjes “() ” geven letterlijke haakjes aan.
- de verticale balk ” | ” geeft een logische OR aan.
- accolades “{ } ” omsluiten een reeks opties.
- een komma gevolgd door een ellips tussen vierkante haakjes “” geeft aan dat het vorige item kan herhalen in een door komma ‘ s gescheiden lijst.
beschrijving
een analytische functie berekent resultaten over een groep rijen. U kunt de volgende syntaxis gebruiken om een analytische functie te bouwen:
-
analytic_function_name
: de functie die een analytische bewerking uitvoert.Bijvoorbeeld, de nummering functieRANK()
kan hier worden gebruikt. -
argument_list
: argumenten die specifiek zijn voor de analytische functie.Sommige functies hebben ze, sommige niet. -
OVER
: sleutelwoord vereist in de analytische functie syntaxis voorafgaand aan deOVER
clausule. -
over_clause
: verwijst naar een venster dat een groep rijen in een tabel definieert waarop een analytische functie moet worden gebruikt. -
window_specification
: definieert de specificaties voor het venster. -
window_frame_clause
: definieert het vensterframe voor het venster. -
rows_range
: definieert de fysieke rijen of alogisch bereik voor een vensterframe.
notities
een analytische functie kan verschijnen als een scalaire expressieoperand op twee plaatsen in de query:
- De
SELECT
lijst. Als de analytische functie in deSELECT
lijst voorkomt, kunnen de lijst met argumenten enOVER
niet verwijzen naar aliassen die in dezelfde selectielijst zijn geïntroduceerd. - de
ORDER BY
clausule. Als de analytische functie voorkomt in deORDER BY
clausule van de query, kan de lijst met argumenten verwijzen naarSELECT
lijstaliassen.
een analytische functie kan niet verwijzen naar een andere analytische functie in zijnargument-lijst of zijn OVER
clausule, zelfs niet indirect via een alias.
een analytische functie wordt geëvalueerd na aggregatie. Bijvoorbeeld, deGROUP BY
clausule en niet-analytische aggregaat functies worden eerst geëvalueerd.Omdat geaggregeerde functies vóór analytische functies worden geëvalueerd,kunnen geaggregeerde functies worden gebruikt als inputoperanden voor analytische functies.
geeft
een enkel resultaat voor elke rij in de invoer.
Defining the OVER clause
analytic_function_name ( ) OVER over_clauseover_clause: { named_window | ( ) }
Description
The OVER
clause references a window that defines a group of rows in a table upon which to use an analytic function. U kunt eennamed_window
opgeven die is gedefinieerd in uw zoekopdracht, of u kunt de specificaties voor een nieuw venster definiëren.
Notes
als geen vensterspecificatie met naam of vensterspecificatie is opgegeven, worden alle invoerrijen voor elke rij in het venster opgenomen.
voorbeelden met behulp van de OVER
clausule
Deze queries gebruiken vensterspecificaties:
- Bereken een algemeen totaal
- Bereken een subtotaal
- Bereken een cumulatieve Som
- Bereken een voortschrijdend gemiddelde
- Bereken het aantal items binnen een bereik
- haal het meest populaire item in elk categorie
- haal de laatste waarde in een bereik
- bereken rang
deze queries gebruiken een venster met naam:
- haal de laatste waarde in een bereik
- gebruik een venster met naam in een vensterframe-clausule
Defining the window specification
window_specification: ] ]
Description
definieert de specificaties voor het venster.
-
named_window
: de naam van een bestaand venster dat was gedefinieerd met eenWINDOW
clausule.
-
PARTITION BY
: splitst de invoerrijen op in afzonderlijke partities, waarover de analytische functie onafhankelijk wordt geëvalueerd.- meerdere partitie expressies zijn toegestaan in de
PARTITION BY
clausule. - een expressie kan geen floating-point types, niet-groepeerbare types,constanten of analytische functies bevatten.
- als deze optionele clausule niet wordt gebruikt, comprimeren alle rijen in de invoertafel een enkele partitie.
- meerdere partitie expressies zijn toegestaan in de
-
ORDER BY
: definieert hoe rijen worden geordend binnen een partitie.Deze bepaling is in de meeste situaties optioneel, maar is in sommige gevallen vereist voor navigatiefuncties. -
window_frame_clause
: Voor aggregate analyticfuncties definieert u het vensterframe binnen de huidige partitie.Het vensterraam bepaalt wat er in het venster moet worden opgenomen.Als deze clausule wordt gebruikt, isORDER BY
vereist, behalve voor volledig niet-gebundelde vensters.
Notes
Als noch deORDER BY
clausule noch vensterframe clausule aanwezig zijn,bevat het vensterframe alle rijen in die partitie.
voor geaggregeerde analytische functies, als deORDER BY
clausule aanwezig is, maar de window frame clausule niet, wordt de volgende window frame clausule standaard gebruikt:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
bijvoorbeeld, de volgende query ‘ s zijn equivalent:
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
Regels voor het gebruik van een venster met de naam in het venster specificaties
Als u een venster met de naam in uw venster specificaties, deze regels zijn van toepassing:
- De specificaties in de naam in het venster kan worden extendedwith nieuwe specificaties die u opgeeft in het venster bestektekst.
- u kunt geen overbodige definities hebben. Als u een
ORDER BY
clausin het named window en de window specification clause hebt, wordt anerror gegooid. -
De volgorde van de clausules is van belang.
PARTITION BY
moet eerst komen,gevolgd doorORDER BY
enwindow_frame_clause
. Als u een venster met naam toevoegt, worden de vensterspecificaties eerst verwerkt.--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)
-
een venster met naam en
PARTITION BY
kunnen niet samen verschijnen in de Windows-specificatie. Als uPARTITION BY
nodig hebt, voeg het dan toe aan het benoemde venster. -
u kunt niet verwijzen naar een venster met een naam in een
ORDER BY
clausule, een externe query of een subquery.
voorbeelden met behulp van de vensterspecificatie
Deze queries definiëren partities in een analytische functie:
- Bereken een subtotaal
- Bereken een cumulatieve Som
- haal het meest populaire item in elke categorie
- haal de laatste waarde in een bereik
- Bereken rang
- gebruik een genoemd venster in een vensterframe-clausule
deze queries bevatten een venster met een naam in een vensterspecificatie:
- haal de laatste waarde in een bereik
- gebruik een venster met naam in een vensterframe-clausule
Deze queries bepalen hoe rijen worden geordend in een partitie:
- het Berekenen van een subtotaal
- het Berekenen van de cumulatieve som
- het Berekenen van een zwevend gemiddelde
- het Berekenen van het aantal items binnen een bereik
- de meest populaire items in elke categorie
- de laatste waarde in een bereik
- Bereken de rang
- Gebruik een benoemde raam in een kozijn-component
Definiëren van de kozijn-component
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
Het venster frame clausule bepaalt het venster kader rond de huidige rij withina partitie, waarop de analytische functie wordt geëvalueerd.Alleen geaggregeerde analytische functies kunnen een window frame-clausule gebruiken.
-
rows_range
: een clausule die een vensterframe definieert met fysieke rijen of een logisch bereik.-
ROWS
: berekent het vensterframe op basis van fysieke offsets van de huidige rij. U kunt bijvoorbeeld twee rijen voor en na de huidige rij opnemen. -
RANGE
: berekent het vensterframe op basis van een logisch rijbereik rond de huidige rij, gebaseerd op de huidige rijORDER BY
sleutelwaarde.De opgegeven bereikwaarde wordt toegevoegd of afgetrokken aan de sleutelwaarde van de huidige rij om een begin-of eindbereikgrens voor het window-frame te definiëren. In een range-based window frame, moet er precies oneexpression zijn in deORDER BY
clausule, en de expressie moet anumeriek type hebben.
Tip: Als u een bereik met een datum wilt gebruiken, gebruik dan
ORDER BY
met de functieUNIX_DATE()
. Als u een bereik met een tijdstempel wilt gebruiken,gebruikt u de functieUNIX_SECONDS()
UNIX_MILLIS()
, ofUNIX_MICROS()
. -
-
frame_between
: maakt een vensterframe aan met een onder-en bovengrens.De eerste grens vertegenwoordigt de ondergrens. De tweede grens vertegenwoordigt de bovengrens. Alleen bepaalde grenscombinaties kunnen worden gebruikt, zoals weergegeven in de voorgaande syntaxis.- Definieer het begin van het vensterframe met
unbounded_preceding
numeric_preceding
numeric_following
, ofcurrent_row
.-
unbounded_preceding
: het vensterframe begint aan het begin van de partitie. -
numeric_preceding
ornumeric_following
: het begin van het windowframe is relatief aan de huidige rij. -
current_row
: het vensterraam begint op de huidige rij.
-
- Definieer het einde van het vensterframe met
numeric_preceding
numeric_following
current_row
, ofunbounded_following
.-
numeric_preceding
ornumeric_following
: het einde van het windowframe is relatief aan de huidige rij. -
current_row
: Het vensterraam eindigt op de huidige rij. -
unbounded_following
: het vensterframe eindigt aan het einde van de partitie.
-
- Definieer het begin van het vensterframe met
-
frame_start
: maakt een vensterframe aan met een ondergrens.Het vensterraam eindigt op de huidige rij.-
unbounded_preceding
: het vensterframe begint aan het begin van de partitie. -
numeric_preceding
: het begin van het vensterframe is relatief aan de huidige rij. -
current_row
: het vensterraam begint op de huidige rij.
-
-
numeric_expression
: een uitdrukking die een numeriek type vertegenwoordigt.De numerieke uitdrukking moet een constante, niet-negatieve integeror parameter zijn.
Notes
als een grens verder reikt dan het begin of het einde van een partitie,zal het vensterframe alleen rijen van binnen die partitie bevatten.
u kunt geen vensterframe-clausule gebruiken met navigatie-functies en nummering-functies, zoals RANK()
.
voorbeelden met behulp van de window frame clausule
deze queries berekenen waarden met ROWS
:
- Bereken een cumulatieve Som
- Bereken een voortschrijdend gemiddelde
- haal het meest populaire item in elke categorie
- haal de laatste waarde in een bereik
- gebruik een venster met naam in een vensterframe-clausule
Deze queries berekenen waarden met RANGE
:
- bereken het aantal items binnen een bereik
deze queries berekenen waarden met een gedeeltelijk of volledig ongebonden venster:
- Bereken een algemeen totaal
- Bereken een subtotaal
- Bereken een cumulatieve Som
- haal het meest populaire item in elke categorie
- Bereken rang
Deze queries bereken waarden met numerieke grenzen:
- Bereken een cumulatieve Som
- Bereken een voortschrijdend gemiddelde
- Bereken het getal van items binnen een bereik
- krijg de laatste waarde in een bereik
- gebruik een venster met naam in een Vensterframe-Clausule
deze queries berekenen waarden met de huidige rij als grens:
- Bereken een algemeen totaal
- Bereken een subtotaal
- Bereken een cumulatieve Som
refererend aan een venster met naam
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 | ( ) }
een venster met naam vertegenwoordigt een groep rijen in een tabel waarop ananalytische functie moet worden gebruikt. Een venster met naam wordt gedefinieerd in deWINDOW
clausule, en er wordt verwezen naar OVER
clause.In eenOVER
clausule, een venster met naam kan op zichzelf verschijnen of ingebed zijn in een vensterspecificatie.
voorbeelden
- haal de laatste waarde in een bereik
- gebruik een venster met naam in een vensterframe-clausule
Navigatiefunctieconcepten
navigatiefuncties berekenen over het algemeen watvalue_expression
over een andere rij in het vensterframe dan de huidige rij. De syntaxis van de OVER
varieert tussen navigatiefuncties.
vereisten voor deOVER
clausule:
-
PARTITION BY
: facultatief. -
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
voor alle navigatiefuncties is het gegevenstype resultaat hetzelfde alsvalue_expression
.
nummering functieconcepten
nummering functies toewijzen gehele waarden aan elke rij op basis van hun positie binnen het opgegeven venster.
voorbeeld vanRANK()
DENSE_RANK()
, enROW_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()
: Voor x=5, isrank
4, omdatRANK()
verhogingen door het aantal peers in de vorige venstervolgorde groep. -
DENSE_RANK()
: Voor x=5,dense_rank
is 3, aangezienDENSE_RANK()
altijd eisen door 1, nooit overslaan van een waarde. -
ROW_NUMBER()
: Voor x=5,row_num
is 4.
geaggregeerde analytische functieconcepten
een geaggregeerde functie is een functie die een berekening uitvoert op aset van waarden. De meeste geaggregeerde functies kunnen in ananalytische functie worden gebruikt. Deze aggregaatfuncties worden aggregaatanalytische functies genoemd.
bij geaggregeerde analytische functies wordt de clausule OVER
toegevoegd aan de functieaanroep; de syntaxis van de functieaanroep blijft verder ongewijzigd.Net als hun aggregate functie tegenhangers, voeren deze analytische functies aggregaties uit, maar specifiek over het relevante raamkader voor elke rij.De types van de resultaatgegevens van deze analytische functies zijn hetzelfde als hun tegenhangers van de gegregate functie.
voorbeelden van analytische functies
in deze voorbeelden is het gemarkeerde item de huidige rij. De boldeditems zijn de rijen die zijn opgenomen in de analyse.
gemeenschappelijke tabellen gebruikt in voorbeelden
de volgende tabellen worden gebruikt in de volgende voorbeelden: Produce
Employees
,en Farm
.
produceer tabel
enkele voorbeelden verwijzen naar een tabel genaamd 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 |+-------------------------------------+
werknemers tabel
enkele voorbeelden refereren een tabel genaamd 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 tabel
enkele voorbeelden refereren een tabel genaamd 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 |+-------------------------------------+
Bereken een totaal
Dit berekent een totaal voor alle items in de tabelProduce
.
- (sinaasappel, appel, prei, kool, sla, boerenkool) = 54 totale aankopen
- (sinaasappel, appel, prei, kool, sla, boerenkool) = 54 totale aankopen
- (sinaasappel, appel, prei, kool, sla, boerenkool) = 54 totale aankopen
- (sinaasappel, appel, prei, kool, sla, boerenkool) = 54 totale aankopen
- (sinaasappel, appel, prei, kool, sla, boerenkool) = 54 totale aankopen
- (sinaasappel, appel, prei, kool, sla, boerenkool) = 54 totale aankopen
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 |+-------------------------------------------------------+
het Berekenen van een subtotaal
Dit berekent een subtotaal voor elke categorie in deProduce
tabel.
- fruit
- (sinaasappel, appel) = 10 totale aankopen
- (sinaasappel, appel) = 10 totale aankopen
- plantaardige
- (prei, kool, sla, boerenkool) = 44 Totale aankopen
- (prei, kool, sla, boerenkool) = 44 totaal aankopen
- (prei, kool, sla, boerenkool) = 44 Totale aankopen
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 |+-------------------------------------------------------+
bereken een cumulatieve Som
deze berekent een cumulatieve som voor elke categorie in de tabelProduce
. De som wordt berekend met betrekking tot de volgorde die is gedefinieerd met behulp van de ORDER BY
clausule.
- fruit
- (sinaasappel, appel) = 2 totale aankopen
- (sinaasappel, appel) = 10 totaal aankopen
- plantaardige
- (prei, kool, sla, boerenkool) = 2 totale aankopen
- (prei, kool, sla, boerenkool) = 11 totaal aankopen
- (prei, kool, sla, boerenkool) = 21 de totale aankopen
- (prei, kool, sla, boerenkool) = 44 totaal van de aankopen
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 |+-------------------------------------------------------+
Dit doet hetzelfde als het vorige voorbeeld. U hoeftCURRENT ROW
niet toe te voegen als een grens, tenzij u dat wilt voor de leesbaarheid.
SELECT item, purchases, category, SUM(purchases) OVER ( PARTITION BY category ORDER BY purchases ROWS UNBOUNDED PRECEDING ) AS total_purchasesFROM Produce
In dit voorbeeld zijn alle items in de tabel Produce
opgenomen in de partitie. Alleen voorgaande rijen worden geanalyseerd. De analyse begint twee keer voor de huidige rij in de partitie.
- (oranje, prei, appel, kool, sla, boerenkool) = = NULL
- (oranje, prei, appel, kool, sla, boerenkool) = = NULL
- (oranje, prei, appel, kool, sla, boerenkool) = 2
- (oranje, prei, appel, kool, sla, boerenkool) = 4
- (oranje, prei, appel, kool, sla, boerenkool) = 12
- (oranje, prei, appel, kool, sla, boerenkool) = 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 |+-------------------------------------------------------+
het Berekenen van een zwevend gemiddelde
Deze berekent van een voortschrijdend gemiddelde in de Produce
tabel.De ondergrens is 1 rij voor de huidige rij. De bovengrens is 1 rij na de huidige rij.
- (oranje, prei, appel, kool, sla, boerenkool) = 2 gemiddelde aankopen
- (oranje, prei, appel, kool, sla, boerenkool) = 4 gemiddelde aankopen
- (oranje, prei, appel, kool, sla, boerenkool) = 6.3333 gemiddelde aankopen
- (oranje, prei, appel, kool, sla, boerenkool) = 9 gemiddelde aankopen
- (oranje, prei, appel, kool, sla, boerenkool) = 14 gemiddelde aankopen
- (oranje, prei, appel, kool, sla, boerenkool) = 16.5 gemiddelde aankopen
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 |+-------------------------------------------------------+
Bereken het aantal items binnen een bereik
Dit voorbeeld krijgt het aantal dieren met een vergelijkbare populatie in de Farm
tabel.
- (gans, hond, OS, geit, eend, Kat) = 4 dieren tussen populatie 0-2.
- (gans, hond, OS, geit, eend, kat) = 5 Dieren tussen populatie 1-3.
- (gans, hond, OS, geit, eend, kat) = 5 Dieren tussen populatie 1-3.
- (gans, hond, OS, geit, eend, kat) = 5 Dieren tussen populatie 1-3.
- (gans, hond, OS, geit, eend, Kat) = 4 dieren tussen populatie 2-4.
- (gans, hond, OS, geit, eend, Kat) = 1 dier tussen populatie 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 |+----------------------------------------------------------+
haal het meest populaire item in elke Categorie
dit voorbeeld krijgt het meest populaire item in elke categorie. Het definieert hoe rijen in een venster worden gepartitioneerd en geordend in elke partitie. Er wordt verwezen naar de tabelProduce
.
- fruit
- (sinaasappel, appel) = apple is het meest populair
- (sinaasappel, appel) = apple is het meest populair
- plantaardige
- (prei, kool, sla, boerenkool) = boerenkool is het meest populair
- (prei, kool, sla, boerenkool) = boerenkool is het meest populair
- (prei, kool, sla, boerenkool) = boerenkool is het meest populair
- (prei, kool, sla, boerenkool) = boerenkool is het meest populair
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 |+----------------------------------------------------+
Voor de laatste waarde in een bereik
in Dit voorbeeld krijgt de meest populaire items in een specifieke kozijn, usingthe Produce
tabel. Het raamframe analyseert tot drie keer per keer. Bekijk de kolom most_popular
voor groenten.In plaats van het meest populaire item in een specifieke categorie te krijgen, krijgt het het meest populaire item in een specifiek bereik in die categorie.
- fruit
- (sinaasappel, appel) = apple is het meest populair
- (sinaasappel, appel) = apple is het meest populair
- plantaardige
- (prei, kool, sla, boerenkool) = kool is het meest populaire
- (prei, kool, sla, boerenkool) = sla is het meest populair
- (prei, kool, sla, boerenkool) = boerenkool is het meest populair
- (prei, kool, sla, boerenkool) = boerenkool is het meest populair
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 |+----------------------------------------------------+
in Dit voorbeeld geeft dezelfde resultaten als in het voorgaande voorbeeld, maar het includesa genoemde venster met de naam item_window
. Sommige vensterspecificaties zijn direct gedefinieerd in deOVER
clausule en sommige zijn gedefinieerd in het genoemde venster.
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
dit voorbeeld berekent de rang van elke werknemer binnen hun afdeling,op basis van hun startdatum. De vensterspecificatie wordt direct gedefinieerd in de OVER
clausule. Er wordt verwezen naar de tabel Employees
.
- afdeling 1
- (Jacob, Anthony, Andrew) = Toewijzen rank 1 Jacob
- (Jacob, Anthony, Andrew) = Toewijzen rang 2 Anthony
- (Jacob, Anthony, Andrew) = Toewijzen rang 3 Andrew
- afdeling 2
- (Isabella, Daniel, Jose) = Toewijzen rank 1 Isabella
- (Isabella, Daniel, Jose) = Toewijzen rang 2 Daniel
- (Isabella, Daniel, Jose) = Toewijzen 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 |+--------------------------------------------+
Gebruik een naam raam in een kozijn-component
kunt U een aantal van uw logica in een venster met de naam en een deel van het in een window frame clausule. Deze logica wordt gecombineerd. Hier is een voorbeeld, met behulp van deProduce
tabel.
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 |+-------------------------------------------------------+
u kunt de vorige resultaten ook krijgen met deze voorbeelden:
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)
het volgende voorbeeld geeft een fout aan omdat een vensterframe-clausule tweemaal is gedefinieerd:
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