sql >> Database teknologi >  >> RDS >> Database

Data tutorial:Brug af vinduesfunktioner

Hvad er vinduesfunktioner?

Vinduesfunktioner gør det muligt for brugere at udføre beregninger mod partitioner (dvs. undergrupper eller sektioner) af et resultatsæt, typisk en tabel eller resultaterne fra en anden forespørgsel. I modsætning til traditionelle aggregeringsfunktioner, som kun returnerer en enkelt værdi for hver gruppe defineret i forespørgslen, returnerer vinduesfunktioner en enkelt værdi for hver inputrække.

Hvordan er vinduesfunktioner nyttige?

Vinduesfunktioner øger effektiviteten og reducerer kompleksiteten af ​​forespørgsler, der analyserer partitioner (vinduer) af et datasæt ved at give et alternativ til mere komplekse SQL-koncepter, f.eks. afledte forespørgsler. Almindelige brugstilfælde omfatter:

  • Rangering af resultater inden for et specifikt vindue (f.eks. rangering pr. gruppe)
  • Adgang til data fra en anden række i et bestemt vindue (f.eks. periodisk rapportering)
  • Aggregation inden for et bestemt vindue (f.eks. løbende totaler):

Sådan bruges vinduesfunktioner

Vinduesfunktioner startes med OVER klausul, og er konfigureret ved hjælp af tre koncepter:

  • vinduespartition (PARTITION BY ) - grupperer rækker i partitioner
  • vinduebestilling (ORDER BY ) - definerer rækkefølgen eller rækkefølgen af ​​rækker inden for hvert vindue
  • vinduesramme (ROWS ) - definerer vinduet ved brug af en offset fra den angivne række

Syntaksoversigt

function (expression) OVER
     ( [ PARTITION BY expression_list ]
       [ ORDER BY order_list ]
       [ ROWS frame_clause ])

Definitioner

  • udtryksliste:kommasepareret liste over udtryk, typisk kolonnenavne
  • ordre_list:kommasepareret liste over udtryk, typisk kolonnenavne
  • frame_clause:definer offset ved hjælp af CURRENT ROW , _value_ PRECEDING , UNBOUNDED PRECEDING , _value_ FOLLOWING , UNBOUNDED FOLLOWING

Eksempler

Rangering:rangering pr. gruppe

SELECT
      campaign
    , month
    , total_cost
    , rank() OVER (PARTITION BY month ORDER BY month DESC, total_cost DESC) as "rank"
FROM Cost_by_Month
LIMIT 8

Forrige række:periode-over-periode analyse

SELECT
      campaign
    , month
    , total_cost
    , LAG(total_cost, 1) OVER (ORDER BY campaign, month) as "previous total cost"
FROM Cost_by_Month
WHERE campaign = 'TV'
LIMIT 4

Aggregation inden for et vindue:løbende totaler

SELECT
    campaign, month, monthly_cost
  , sum(monthly_cost) OVER (PARTITION BY campaign ORDER BY month ROWS BETWEEN UNBOUNDED
    PRECEDING and CURRENT ROW) as "running cost total"
FROM Cost_by_Month

Dokumentations- og funktionsliste:

Bemærk venligst, at der er små forskelle i brug og syntaks fra database til database. For oplysninger, der er specifikke for din implementering, skal du bruge den kildespecifikke dokumentation, der er angivet nedenfor.

Postgres

  • Selvstudie
  • Funktioner

Rødskift

  • Selvstudie
  • Funktioner

Oracle

  • Selvstudie

SQLServer

  • Selvstudie

BigQuery

  • Selvstudie

  1. postgresql databaseejer kan ikke få adgang til databasen - Ingen relationer fundet.

  2. MySQL automatisk caste/konvertere en streng til et tal?

  3. SQL Server - Bedste måde at få identitet for indsat række?

  4. hvordan udfører man Stored Procedure i SQL Developer?