Toate funcțiile de fereastră SQL uzuale și clauzele care le controlează, grupate după sarcină: ierarhizarea rândurilor, privirea spre vecini, totaluri care rulează pe un cadru și extragerea primelor sau ultimelor valori. Fiecare rând asociază funcția cu un exemplu pe o singură linie.
O funcție fereastră calculează un rezultat peste rândurile înrudite cu rândul curent, fără a le comprima așa cum face GROUP BY. Fiecare funcție fereastră se încheie cu o clauză OVER care definește fereastra: PARTITION BY grupează rândurile, ORDER BY le ordonează, iar cadrul opțional limitează setul glisant. Stăpânește OVER și restul e vocabular.
Tabel de referință · 27 intrări
Funcții de fereastră SQLExplained
27 of 27 rows
Ierarhizare
Un întreg secvențial unic pentru fiecare rând din fereastră.
ROW_NUMBER() OVER (ORDER BY total DESC)
Rang cu goluri; egalitățile împart același rang și sar următoarele numere.
RANK() OVER (ORDER BY total DESC)
Rang fără goluri; egalitățile împart același rang și nimic nu este omis.
DENSE_RANK() OVER (ORDER BY total DESC)
Împarte fereastra ordonată în n grupuri aproximativ egale.
NTILE(4) OVER (ORDER BY total DESC)
O privire spre vecini
O valoare de la n rânduri în urmă; valoarea implicită o înlocuiește când un astfel de rând nu există.
LAG(total, 1, 0) OVER (ORDER BY created_at)
O valoare de la n rânduri înainte; valoarea implicită o înlocuiește când un astfel de rând nu există.
LEAD(total, 1, 0) OVER (ORDER BY created_at)
Agregare peste o fereastră
Un total cumulat sau pe partiție, fără a comprima rândurile.
SUM(total) OVER (ORDER BY created_at)
O medie cumulată sau pe partiție.
AVG(total) OVER (PARTITION BY user_id)
Un număr de rânduri cumulat sau pe partiție.
COUNT(*) OVER (PARTITION BY user_id)
Cea mai mică valoare din fereastră sau partiție.
MIN(total) OVER (PARTITION BY user_id)
Cea mai mare valoare din fereastră sau partiție.
MAX(total) OVER (PARTITION BY user_id)
SUM cu ORDER BY și un cadru deschis la început; fiecare rând însumează totul până la el însuși.
SUM(total) OVER (ORDER BY created_at ROWS UNBOUNDED PRECEDING)
AVG peste un cadru de n rânduri înainte și după rândul curent.
AVG(total) OVER (ORDER BY created_at ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)
Prime, ultime și percentile
Prima valoare din ordonarea ferestrei.
FIRST_VALUE(total) OVER (ORDER BY total DESC)
Ultima valoare din cadru; fără UNBOUNDED FOLLOWING cadrul se oprește la rândul curent.
LAST_VALUE(total) OVER (ORDER BY total ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
Valoarea de pe al n-lea rând al ordonării ferestrei.
NTH_VALUE(total, 2) OVER (ORDER BY total DESC)
Rangul relativ al unui rând, de la 0 la 1.
PERCENT_RANK() OVER (ORDER BY total)
Proporția rândurilor de la sau înainte de rândul curent, de la 1/n până la 1.
CUME_DIST() OVER (ORDER BY total)
Clauza OVER
Definește fereastra pe care o citește fiecare funcție.
<fn>() OVER (PARTITION BY user_id ORDER BY created_at)
Repornește fereastra pentru fiecare grup de rânduri.
PARTITION BY user_id
Ordonează rândurile în interiorul fiecărei partiții.
ORDER BY created_at
Limitează cadrul glisant, de exemplu de la rândurile precedente la cele următoare.
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
Limitează cadrul după valori, nu după pozițiile rândurilor; CURRENT ROW include egalitățile, iar acesta este cadrul implicit sub ORDER BY.
RANGE BETWEEN 100 PRECEDING AND CURRENT ROW
Limitează cadrul după grupuri de rânduri egale din ORDER BY.
GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
Scoate rândul curent din cadru; EXCLUDE TIES scoate în schimb egalitățile lui.
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW
Dă ferestrei un nume o dată per interogare, ca mai multe clauze OVER să o poată reutiliza.
WINDOW w AS (PARTITION BY user_id ORDER BY created_at)
Restrânge rândurile pe care le citește un agregat de fereastră, înainte de aplicarea ferestrei.
SUM(total) FILTER (WHERE status = 'paid') OVER (ORDER BY created_at)