sql >> Databasteknik >  >> RDS >> Database

Datahandledning:Använda fönsterfunktioner

Vad är fönsterfunktioner?

Fönsterfunktioner gör det möjligt för användare att utföra beräkningar mot partitioner (d.v.s. undergrupper eller sektioner) av en resultatuppsättning, vanligtvis en tabell eller resultaten från en annan fråga. Till skillnad från traditionella aggregeringsfunktioner, som endast returnerar ett enda värde för varje grupp som definieras i frågan, returnerar fönsterfunktioner ett enda värde för varje inmatningsrad.

Hur är fönsterfunktioner användbara?

Fönsterfunktioner ökar effektiviteten och minskar komplexiteten i frågor som analyserar partitioner (fönster) av en datamängd genom att tillhandahålla ett alternativ till mer komplexa SQL-koncept, t.ex. härledda frågor. Vanliga användningsfall inkluderar:

  • Rankning av resultat inom ett specifikt fönster (t.ex. rankning per grupp)
  • Åtkomst till data från en annan rad i ett specifikt fönster (t.ex. period-över-period-rapportering)
  • Aggregation inom ett specifikt fönster (t.ex. löpande totaler):

Hur man använder fönsterfunktioner

Fönsterfunktioner initieras med OVER sats, och är konfigurerade med hjälp av tre koncept:

  • fönsterpartition (PARTITION BY ) - grupperar rader i partitioner
  • fönsterbeställning (ORDER BY ) - definierar ordningen eller sekvensen av rader inom varje fönster
  • fönsterram (ROWS ) - definierar fönstret med hjälp av en offset från den angivna raden

Syntaxöversikt

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

Definitioner

  • expression_list:kommaseparerad lista med uttryck, vanligtvis kolumnnamn
  • order_list:kommaseparerad lista med uttryck, vanligtvis kolumnnamn
  • frame_clause:definiera offset med CURRENT ROW , _value_ PRECEDING , UNBOUNDED PRECEDING , _value_ FOLLOWING , UNBOUNDED FOLLOWING

Exempel

Rankning:rankning per grupp

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

Föregående rad:period-över-period analys

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 inom ett fönster:löpande summor

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- och funktionslista:

Observera att det finns subtila skillnader i användning och syntax från databas till databas. För information som är specifik för din implementering, använd den källspecifika dokumentationen nedan.

Postgres

  • Självstudie
  • Funktioner

Rödskiftning

  • Självstudie
  • Funktioner

Oracle

  • Självstudie

SQLServer

  • Självstudie

BigQuery

  • Självstudie

  1. FEL 1130 (HY000):Värden '' får inte ansluta till denna MySQL-server

  2. Hur kan jag säkerhetskopiera en fjärrbaserad SQL Server-databas till en lokal enhet?

  3. Hur använder man scheman i Django?

  4. Inaktivera SA-kontot i SQL Server (T-SQL-exempel)