Skip to content

Funcții de fereastră SQL explicate

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