sql >> Database >  >> RDS >> Database

Zelfstudie gegevens:Vensterfuncties gebruiken

Wat zijn vensterfuncties?

Met vensterfuncties kunnen gebruikers berekeningen uitvoeren op partities (d.w.z. subgroepen of secties) van een resultatenset, meestal een tabel of de resultaten van een andere query. In tegenstelling tot traditionele aggregatiefuncties, die slechts één waarde retourneren voor elke groep die in de query is gedefinieerd, retourneren vensterfuncties één enkele waarde voor elke invoerrij.

Hoe zijn vensterfuncties nuttig?

Vensterfuncties verhogen de efficiëntie en verminderen de complexiteit van query's die partities (vensters) van een gegevensset analyseren door een alternatief te bieden voor complexere SQL-concepten, b.v. afgeleide zoekopdrachten. Veelvoorkomende toepassingen zijn onder meer:

  • Rangschikkingsresultaten binnen een specifiek venster (bijv. rangschikking per groep)
  • Toegang tot gegevens uit een andere rij in een specifiek venster (bijv. periode-op-periode rapportage)
  • Aggregatie binnen een specifiek venster (bijv. lopende totalen):

Vensterfuncties gebruiken

Vensterfuncties worden gestart met de OVER clausule, en worden geconfigureerd met behulp van drie concepten:

  • vensterpartitie (PARTITION BY ) - groepeert rijen in partities
  • venster bestellen (ORDER BY ) - definieert de volgorde of volgorde van rijen binnen elk venster
  • raamkozijn (ROWS ) - definieert het venster met behulp van een offset van de opgegeven rij

Syntaxoverzicht

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

Definities

  • expression_list:door komma's gescheiden lijst van uitdrukkingen, meestal kolomnamen
  • order_list:door komma's gescheiden lijst van uitdrukkingen, meestal kolomnamen
  • frame_clause:definieer de offset met CURRENT ROW , _value_ PRECEDING , UNBOUNDED PRECEDING , _value_ FOLLOWING , UNBOUNDED FOLLOWING

Voorbeelden

Ranking:rangschikking per groep

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

Vorige rij: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

Aggregatie binnen een venster:lopende totalen

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

Documentatie- en functielijst:

Houd er rekening mee dat er subtiele verschillen in gebruik en syntaxis bestaan ​​van database tot database. Gebruik de bronspecifieke documentatie hieronder voor informatie die specifiek is voor uw implementatie.

Postgres

  • Zelfstudie
  • Functies

Roodverschuiving

  • Zelfstudie
  • Functies

Oracle

  • Zelfstudie

SQLServer

  • Zelfstudie

BigQuery

  • Zelfstudie

  1. hibernate orakelreeks produceert grote opening

  2. Hoe voer ik een mysqldump uit zonder een wachtwoordprompt?

  3. Selecteer laatste N rijen van MySQL

  4. Trade-offs in Hot Standby-implementaties