Articles

Analytiske funksjonskonsepter i Standard SQL

en analytisk funksjon beregner verdier over en gruppe rader og returnerer asingle resultat for hver rad. Dette er forskjellig fra en mengdefunksjon,som returnerer et enkelt resultat for en gruppe rader.

en analytisk funksjon inkluderer en OVER – klausul, som definerer et vindu av raderrundt raden som evalueres. For hver rad, analysefunksjonen resultterberegnes ved hjelp av det valgte vinduet rader som input, possiblydoing aggregering.

med analytiske funksjoner kan du beregne glidende gjennomsnitt, rangere elementer, kalkulere kumulative summer og utføre andre analyser.

følgende funksjoner kan brukes som analytiske funksjoner:navigasjonsfunksjoner,nummereringsfunksjoner og aggregerte analytiske funksjoner

analytisk funksjonssyntaks

analytic_function_name ( ) OVER over_clauseover_clause: { named_window | ( ) }window_specification: ] ] window_frame_clause: { rows_range } { frame_start | frame_between }rows_range: { ROWS | RANGE }

Notasjonsregler

  • Hakeparenteser «» indikerer valgfrie klausuler.
  • Parenteser «() » angir bokstavelige parenteser.
  • den vertikale linjen » / » indikerer en logisk ELLER.
  • Curly braces «{ } » vedlegger et sett med alternativer.
  • et komma etterfulgt av en ellipse i firkantede parenteser «» indikerer at det foregående elementet kan gjentas i en kommaseparert liste.

Beskrivelse

en analytisk funksjon beregner resultater over en gruppe rader. Du kan bruke thefollowing syntaks til å bygge en analytisk funksjon:

  • analytic_function_name: funksjonen som utfører en analytisk operasjon.For eksempel kan nummereringsfunksjonen RANK() brukes her.
  • argument_list: Argumenter som er spesifikke for den analytiske funksjonen.Noen funksjoner har dem, noen gjør det ikke.
  • OVER: Nøkkelord som kreves i den analytiske funksjonen syntaks preceding OVER klausul.
  • over_clause: Refererer til et vindu som definerer en groupof rader i en tabell hvorpå å bruke en analytisk funksjon.
  • window_specification: Definerer spesifikasjonene forvinduet.
  • window_frame_clause: Definerer vindusrammenfor vinduet.
  • rows_range: Definerer de fysiske radene eller det alogiske området for en vindusramme.

Merknader

en analytisk funksjon kan vises som en skalar uttrykk operand into steder i spørringen:

  • SELECT listen. Hvis den analytiske funksjonen vises iSELECT – listen, kan ikke argumentlisten ogOVER – setningsdelen referere til aliaser introdusert i DEN SAMME SELECT-listen.
  • ORDER BY – klausulen. Hvis den analytiske funksjonen vises iORDER BY – klausulen i spørringen, kan argumentlisten referere til SELECT listaliaser.

en analytisk funksjon kan ikke referere til en annen analytisk funksjon i sinargumentliste eller dens OVER – klausul, selv indirekte gjennom et alias.

en analytisk funksjon evalueres etter aggregering. For eksempel evalueresGROUP BY-setningsdelen og ikke-analytiske mengdefunksjoner først.Fordi aggregatfunksjoner evalueres før analytiske funksjoner, kan aggregatfunksjoner brukes som inndataoperander til analytiske funksjoner.

Returnerer

et enkelt resultat for hver rad i inngangen.

Definere over-setningsdelen

analytic_function_name ( ) OVER over_clauseover_clause: { named_window | ( ) }

Beskrivelse

OVER setningsdelen refererer til et vindu som definerer en gruppe rader i en tabell som skal bruke en analytisk funksjon. Du kan gi en named_window som er definert i spørringen din, eller du kandefinere spesifikasjonene for et nytt vindu.

Merknader

hvis verken et navngitt vindu eller vindu spesifikasjon er gitt, allinput rader er inkludert i vinduet for hver rad.

Eksempler som brukerOVER klausulen

disse spørringene bruker vindusspesifikasjoner:

  • Beregne en totalsum
  • Beregne en delsum
  • Beregne en kumulativ sum
  • Beregne et glidende gjennomsnitt
  • Beregne antall elementer innenfor et område
  • Få det mest populære elementet i hver kategori
  • få den siste verdien i et område
  • beregne rang

disse spørringene bruker et navngitt vindu:

  • Få den siste verdien i et område
  • Bruk et navngitt vindu i en vindusramme

Definere vindusspesifikasjonen

window_specification: ] ] 

Beskrivelse

Definerer spesifikasjonene for vinduet.

  • named_window: navnet på et eksisterende vindu som var definert med enWINDOW – klausul.
    PARTITION BY: Bryter opp inngangsrader i separate partisjoner, oversom den analytiske funksjonen er uavhengig evaluert.

    • Flere partisjonsuttrykk er tillatt iPARTITION BY – setningsdelen.
    • et uttrykk kan ikke inneholde flyttallstyper, ikke-grupperbare typer, konstanter eller analytiske funksjoner.
    • hvis denne valgfrie klausulen ikke brukes, alle rader i input table en enkelt partisjon.

    ORDER BY: Definerer hvordan rader bestilles i en partisjon.Denne klausulen er valgfri i de fleste situasjoner, men kreves i noen tilfeller for navigasjonsfunksjoner.

  • window_frame_clause: For aggregate analyticfunctions, definerer vindusrammen i gjeldende partisjon.Vindusrammen bestemmer hva som skal inkluderes i vinduet.Hvis denne klausulen brukes, krevesORDER BY bortsett fra fullyunbounded windows.

Merknader

hvis verkenORDER BY klausul eller vindusrammeklausul er til stede, inneholder vindusrammen alle rader i den partisjonen.

for aggregerte analytiske funksjoner, hvisORDER BY – klausulen finnes, men vindusrammeklausulen er ikke, brukes følgende vindusrammeklausul som standard:

RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

følgende spørringer er for eksempel ekvivalente:

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

Regler for bruk av et navngitt vindu i vinduspesifikasjonen

Hvis du bruker et navngitt vindu i vinduspesifikasjonene dine, gjelder disse reglene:

  • spesifikasjonene i det navngitte vinduet kan utvides med nye spesifikasjoner som du definerer i vindusspesifikasjonsklausulen.
  • du kan ikke ha overflødige definisjoner. Hvis du har en ORDER BY klausuli det navngitte vinduet og vinduspesifikasjonsklausulen, kastes anerror.
  • rekkefølgen av klausuler er viktig. PARTITION BY må komme først, etterfulgt av ORDER BY og window_frame_clause. Hvis du legger til et navngitt vindu, behandles vinduets spesifikasjoner først.

    --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)
  • et navngitt vindu og PARTITION BY kan ikke vises sammen i vinduspesifikasjonen. Hvis du trenger PARTITION BY, legg den til det navngitte vinduet.

  • Du kan ikke referere til et navngitt vindu i en ORDER BY – klausul, en ytre spørring eller en delquery.

  • Eksempler som bruker vindusspesifikasjonen

    disse spørringene definerer partisjoner i en analytisk funksjon:

    • Beregne en delsum
    • Beregne en kumulativ sum
    • Få det mest populære elementet i hver kategori
    • Få den siste verdien i et område
    • Beregne rangering
    • Bruk et navngitt vindu i en vindusramme

    disse spørringene inkluderer et navngitt vindu i en vindusspesifikasjon:

    • Få den siste verdien i et område
    • Bruk et navngitt vindu i en vindusramme

    disse spørringene definerer hvordan rader bestilles i en partisjon:

    • Beregne en delsum
    • Beregne en kumulativ sum
    • Beregne et glidende gjennomsnitt
    • Beregne antall elementer innenfor et område
    • Få det mest populære elementet i hver kategori
    • Få den siste verdien i et område
    • Beregne rang
    • Bruk et navngitt vindu i en vindusramme

    Definere vindusrammen klausul

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

Vindusrammeklausulen definerer vindusrammen rundt den gjeldende raden innen Partisjonen, som analysefunksjonen evalueres over.Bare aggregerte analytiske funksjoner kan bruke en vindusrammeklausul.

  • rows_range: en klausul som definerer en vindusramme med fysiske radereller et logisk område.

    • ROWS: Beregner vindusrammen basert på fysiske forskyvninger fra gjeldende rad. Du kan for eksempel inkludere to rader før og etterden nåværende raden.
    • RANGE: Beregner vindusrammen basert på et logisk radområde rundt gjeldende rad, basert på gjeldende radsORDER BY nøkkelverdi.Den angitte områdeverdien legges til eller trekkes fra den gjeldende row ‘ skey-verdien for å definere en start-eller sluttgrensegrense for vindusrammen. I en områdebasert vindusramme må det være nøyaktig enuttrykk iORDER BY – klausulen, og uttrykket må ha anumerisk type.

    Tips: hvis du vil bruke et område med en dato, brukORDER BY medUNIX_DATE() – funksjonen. Hvis du vil bruke et område med et tidsstempel,bruk UNIX_SECONDS()UNIX_MILLIS() eller UNIX_MICROS() – funksjonen.

  • frame_between: Oppretter en vindusramme med en nedre og øvre grense.Den første grensen representerer den nedre grensen. Den andre grensenrepresenterer den øvre grensen. Bare visse grensekombinasjoner kan værebrukes, som vist i forrige syntaks.

    • Definer begynnelsen av vindusrammen med unbounded_precedingnumeric_precedingnumeric_following eller current_row.
      • unbounded_preceding: vindusrammen starter i begynnelsen av partisjonen.
      • numeric_preceding eller numeric_following: starten på windowframe er i forhold til gjeldende rad.
      • current_row: vindusrammen starter på gjeldende rad.
    • Definer slutten på vindusrammen med numeric_precedingnumeric_followingcurrent_row eller unbounded_following.
      • numeric_preceding eller numeric_following: slutten av windowframe er i forhold til gjeldende rad.
      • current_row: Vindusrammen slutter på gjeldende rad.
      • unbounded_following: vindusrammen slutter på slutten avpartisjon.
  • frame_start: Oppretter en vindusramme med en nedre grense.Vindusrammen slutter på gjeldende rad.

    • unbounded_preceding: vindusrammen starter i begynnelsen avpartisjon.
    • numeric_preceding: starten på vindusrammen er i forhold til gjeldende rad.
    • current_row: vindusrammen starter på gjeldende rad.
  • numeric_expression: et uttrykk som representerer en numerisk type.Det numeriske uttrykket må være en konstant, ikke-negativ heltalleller parameter.

Merknader

hvis en grense strekker seg utover begynnelsen eller slutten av en partisjon,vil vindusrammen bare inkludere rader fra den partisjonen.

du kan ikke bruke en vindusrammeklausul mednavigasjonsfunksjoner ognummereringsfunksjoner, for eksempel RANK().

Eksempler som bruker vindusramme

disse spørringene beregner verdier med ROWS:

  • Beregn en kumulativ sum
  • Beregn et glidende gjennomsnitt
  • Få det mest populære elementet i hver kategori
  • Få den siste verdien i et område
  • Bruk et navngitt vindu i en vindusramme

disse spørringene beregner verdier med RANGE:

  • antall elementer i et område

disse spørringene beregner verdier med et delvis eller helt ubundet vindu:

  • Beregne en totalsum
  • Beregne en delsum
  • Beregne en kumulativ sum
  • Få det mest populære elementet i hver kategori
  • Beregne rang
  • disse spørringene beregne verdier med numeriske grenser:

    • Beregne en kumulativ sum
    • Beregne et glidende gjennomsnitt
    • Beregne antall elementer i en
    • få Den Siste Verdien i et område
    • Bruk et navngitt vindu i en vindusramme

    disse spørringene beregner Verdier med gjeldende rad som en grense:

    • Beregne en totalsum
    • Beregne en delsum
    • Beregne en kumulativ sum

    Referere til et navngitt vindu

    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 | ( ) }

    et navngitt vindu representerer en gruppe rader i en tabell som ananalytisk funksjon kan brukes på. Et navngitt vindu er definert iWINDOW – klausulen, og referert til i en analytisk funksjons OVER clause.In enOVER – klausul, et navngitt vindu kan vises enten av seg selv eller innebygd i en vindusspesifikasjon.

    Eksempler

    • Få den siste verdien i et område
    • Bruk et navngitt vindu i en vindusramme

    navigasjonsfunksjonskonsepter

    Navigasjonsfunksjoner beregner vanligvis noenvalue_expression over en annen rad i vindusrammen fra gjeldende rad. OVER setningssyntaksen varierer på tvers av navigasjonsfunksjoner.

    Krav til OVER klausul:

    • PARTITION BY: Valgfritt.
    • 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.

    for alle navigasjonsfunksjoner er resultatdatatypen den samme typen som value_expression.

    nummereringsfunksjonskonsepter

    Nummereringsfunksjoner tilordne heltallverdier tilhver rad basert på deres posisjon i det angitte vinduet.

    Eksempel påRANK()DENSE_RANK() ogROW_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(): For x=5 er rank 4, siden RANK() øker med antall jevnaldrende i forrige vindubestillingsgruppe.
    • DENSE_RANK(): for x=5,dense_rank er 3, sidenDENSE_RANK() alwaysincrments med 1, hopper aldri over en verdi.

    • ROW_NUMBER(): for x=5,row_num er 4.

    Aggregate analytic function concepts

    en aggregatfunksjon er en funksjon som utfører en beregning på asett av verdier. De fleste aggregatfunksjoner kan brukes i ananalytisk funksjon. Disse aggregerte funksjonene kallesaggregerte analytiske funksjoner.

    med aggregerte analytiske funksjoner leggesOVER – klausulen til det aggregerte funksjonskallet; syntaksen for funksjonskallet forblir ellers uendret.Som deres aggregerte funksjonsmodeller utfører disse analytiske funksjoneneaggregasjoner, men spesielt over den aktuelle vindusrammen for hver rad.Resultatdatatypene for disse analytiske funksjonene er de samme som deresaggregerte funksjonsmodeller.

    Eksempler På Analytiske funksjoner

    i disse eksemplene er det uthevede elementet gjeldende rad. Boldeditems er radene som inngår i analysen.

    Vanlige tabeller som brukes i eksempler

    følgende tabeller brukes i de påfølgende aggregate analyticquery-eksemplene: ProduceEmployeesog Farm.

    Produser tabell

    noen eksempler refererer til en tabell kalt 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 |+-------------------------------------+

    Ansatte tabell

    noen eksempler refererer til en tabell kalt 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 tabell

    noen eksempler refererer til en tabell kalt 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 |+-------------------------------------+

    beregn en totalsum

    dette beregner en totalsum for alle elementer iProduce tabellen.

    • (appelsin, eple, purre, kål, salat, grønnkål) = 54 totalt kjøp
    • (appelsin, eple, purre, kål, salat, grønnkål) = 54 totalt kjøp
    • (appelsin, eple, purre, kål, salat, grønnkål) = 54 totalt kjøp
    • (appelsin, eple, purre, kål, salat, grønnkål) = 54 totalt kjøp
    • (appelsin, eple, purre, kål, salat, grønnkål) kale) = 54 totale kjøp
    • (appelsin, eple, purre, kål, salat, grønnkål) = 54 totale kjøp
    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 |+-------------------------------------------------------+

    beregn en delsum

    dette beregner en delsum for hver kategori iProduce tabell.

    • frukt
      • (appelsin, eple) = 10 totale kjøp
    • grønnsak
      • (purre, kål, salat, grønnkål) = 44 totale kjøp
      • (purre, kål, salat, grønnkål) = 44 totale kjøp
      • (purre, kål, salat, grønnkål) = 44 totale kjøp
      • (purre, kål, salat, grønnkål) = 44 totale kjøp
      • /li>
      • (purre, kål, salat, grønnkål) = 44 totale kjøp
    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 |+-------------------------------------------------------+

    beregn en kumulativ sum

    dette beregner en kumulativ sum for hver kategori i Produce tabellen. Summen beregnes med hensyn til teorder definert ved hjelp avORDER BY – klausulen.

    • frukt
      • (appelsin, eple) = 2 totale kjøp
      • (appelsin, eple) = 10 totale kjøp
    • grønnsak
      • (purre, kål, salat, grønnkål) = 21 totale kjøp
      • (purre, kål, salat, grønnkål) = 44 totalt kjøp
    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 |+-------------------------------------------------------+

    dette gjør det samme som det foregående eksemplet. Du trenger ikke å legge tilCURRENT ROW som en grense med mindre du vil for lesbarhet.

    SELECT item, purchases, category, SUM(purchases) OVER ( PARTITION BY category ORDER BY purchases ROWS UNBOUNDED PRECEDING ) AS total_purchasesFROM Produce

    i dette eksemplet er alle elementer i Produce tabellen inkluderti partisjonen. Bare foregående rader analyseres. Analysen starter tworows før gjeldende rad i partisjonen.

    • (oransje, purre, eple, kål, salat, grønnkål) = NULL
    • (oransje, purre, eple, kål, salat, grønnkål) = NULL
    • (oransje, purre, eple, kål, salat, grønnkål) = 2
    • (oransje, purre, eple, kål, salat, grønnkål) = 4
    • (oransje, purre, eple, kål, salat, grønnkål) = 12
    • (oransje, purre, eple, kål, salat, grønnkål) = 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 |+-------------------------------------------------------+

    beregn et glidende gjennomsnitt

    dette beregner et glidende gjennomsnitt iProduce tabellen.Den nedre grensen er 1 rad førnåværende rad. Den øvre grensen er 1 rad etter gjeldende rad.

    • (oransje, purre, eple, kål, salat, grønnkål) = 2 gjennomsnittlig kjøp
    • (oransje, purre, eple, kål, salat, grønnkål) = 4 gjennomsnittlig kjøp
    • (oransje, purre, eple, kål, salat, grønnkål) = 6.3333 gjennomsnittlig kjøp
    • (oransje, purre, eple, kål, salat, grønnkål) = 9 gjennomsnittlig kjøp
    • (oransje, purre, eple, kål, salat, grønnkål) = 9 gjennomsnittlig kjøp
    • (oransje, purre, eple, kål, salat, grønnkål), kale) = 14 gjennomsnittlig kjøp
    • (appelsin, purre, eple, kål, salat, grønnkål) = 16.5 gjennomsnittlig kjøp

    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 |+-------------------------------------------------------+

    Beregn antall elementer innenfor et område

    dette eksemplet får antall dyr som har en lignende populationcount iFarm tabellen.

    • (gås, hund, okse, geit, and, katt) = 4 dyr mellom populasjonsområde 0-2.
    • (gås, hund, okse, geit, and, katt) = 5 dyr mellom populasjonsområde 1-3.
    • (gås, hund, okse, geit, and, katt) = 5 dyr mellom populasjonsområde 1-3.
    • (gås, hund, okse, geit, and, katt) = 5 dyr mellom populasjonsområde 1-3.
    • (gås, hund, okse, geit, and, katt) = 4 dyr mellom populasjonsområde 2-4.
    • (gås, hund, okse, geit, and, katt) = 1 dyr mellom populasjonsområde 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 |+----------------------------------------------------------+

    Få det mest populære elementet i hver kategori

    dette eksemplet får det mest populære elementet i hver kategori. Den definerer hvordan rader i et vindu er partisjonert og bestilt i hver partisjon. Produce tabellen er referert.

    • frukt
      • (appelsin, eple) = eple er mest populær
  • grønnsak
    • (purre, kål, salat, grønnkål) = grønnkål er mest populær
    • (purre, kål, salat, grønnkål) = grønnkål er mest populær
    • (purre, kål, salat, grønnkål) = grønnkål er mest populær
    • (purre, kål, salat, grønnkål) = grønnkål er mest populær
    • (purre, kål, salat, grønnkål) = grønnkål er mest populær
    • /li>
    • (purre, kål, salat, grønnkål)=grønnkål er mest populær
  • 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 |+----------------------------------------------------+

    få den siste verdien i et område

    dette eksemplet får det mest populære elementet i en bestemt vindusramme, ved hjelp av Produce Tabell. Vindusrammen analyserer opptil trerader om gangen. Ta en nærmere titt påmost_popular kolonne for grønnsaker.I stedet for å få det mest populære elementet i en bestemt kategori, blir det mest populære elementet i et bestemt område i den kategorien.

    • frukt
      • (appelsin, eple) = eple er mest populær
  • grønnsak
    • (purre, kål, salat, grønnkål) = kål er mest populær
    • (purre, kål, salat, grønnkål) = salat er mest populær
    • (purre, kål, salat, grønnkål) = grønnkål er mest populær
    • (purre, kål, salat, grønnkål) = grønnkål er mest populær
    • /li>
    • (purre, kål, salat, grønnkål) = grønnkål er mest populær
  • 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 |+----------------------------------------------------+

    dette eksemplet returnerer de samme resultatene som det forrige eksemplet, men det inkludereret navngitte vindu kalt item_window. Noen av vinduspesifikasjonene er definert direkte iOVER – klausulen, og noen er definert i det navngitte vinduet.

    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

    dette eksemplet beregner rangen til hver ansatt i avdelingen,basert på startdato. Vindusspesifikasjonen er definert direkteiOVER – klausulen. Employees tabellen er referert.

    • avdeling 1
      • (Jacob, Anthony, Andrew) = Tilordne rang 1 Til Jacob
      • (Jacob, Anthony, Andrew) = Tilordne rang 2 til Anthony
      • (Jacob, Anthony, Andrew) = Tilordne rang 3 til Andrew
    • avdeling 2
      • (Isabella, Daniel, Jose) = Tilordne rang 1 Til Isabella
      • (Isabella, Daniel, Jose) = Tilordne rang 2 til Isabella daniel
      • (isabella, daniel, jose) = tilordne rang 3 Til 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 |+--------------------------------------------+

    Bruk Et Navngitt vindu i En Vindusramme

    du kan definere noe av logikken din i et navngitt vindu og noe Av det I awindow frame klausul. Denne logikken er kombinert. Her er et eksempel ved å bruke tabellenProduce.

    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 |+-------------------------------------------------------+

    du kan også få de tidligere resultatene med disse eksemplene:

    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)

    følgende eksempel gir en feil fordi en vindusrammeklausul har blitt definert to ganger:

    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)