Funcțiile de fereastră efectuează calcule pe un set de rânduri (o "fereastră") legate de rândul curent, fără a le comprima într-un singur rând de ieșire (spre deosebire de agregate cu GROUP BY). Ele permit analize puternice — totaluri cumulative, clasamente, comparații cu alte rânduri — în timp ce păstrează fiecare rând în rezultat.
Diferența cheie comparativ cu GROUP BY
GROUP BY → collapses groups into ONE row each (you lose individual rows)
Window function → computes across related rows but KEEPS every row
→ You get per-row detail AND aggregate/ranking info together.
Funcții de clasament
SELECT
name, department, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS overall_rank, -- unique sequential rank
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank, -- rank within dept
DENSE_RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dense_rank
FROM employees;
Clauza OVER (...) definește fereastra. PARTITION BY împarte rândurile în grupuri (asemeni GROUP BY, dar per-rând), iar ORDER BY ordonează în cadrul fiecărei partiții. ROW_NUMBER/RANK/DENSE_RANK atribuie clasamente.
Funcții agregate ca funcții de fereastră (totaluri cumulative, agregate per-grup)
SELECT
date, amount,
SUM(amount) OVER (ORDER BY date) AS running_total, -- cumulative sum
AVG(amount) OVER (PARTITION BY category) AS category_avg, -- avg per category, kept per row
amount - AVG(amount) OVER (PARTITION BY category) AS diff_from_avg
FROM transactions;
Agrecatele ca funcții de fereastră calculează totaluri cumulative, medii mobile sau agregate per-partiție, în timp ce păstrează fiecare rând — imposibil cu GROUP BY singur.
LAG/LEAD — comparație cu alte rânduri
SELECT
month, revenue,
LAG(revenue) OVER (ORDER BY month) AS prev_month, -- the previous row's value
revenue - LAG(revenue) OVER (ORDER BY month) AS growth, -- month-over-month change
LEAD(revenue) OVER (ORDER BY month) AS next_month
FROM monthly_revenue;
LAG/LEAD accesează valori din rândurile anterioare/următoare — perfecte pentru comparații de perioadă cu perioadă (creștere de la o lună la alta, etc.).
De ce este important
Funcțiile de fereastră sunt o caracteristică SQL avansată și puternică, esențială pentru interogări analitice, și înțelegerea lor este cunoștință valoroasă de nivel senior pentru analiza datelor, raportare și interogări complexe.
Capacitatea lor definitorie — efectuarea calculelor pe rânduri conexe în timp ce se păstrează fiecare rând (spre deosebire de GROUP BY, care comprima rândurile) — permite o întreagă clasă de analize care este dificilă sau imposibilă altfel: clasamente (ROW_NUMBER/RANK/DENSE_RANK — găsirea top N per grup, atribuirea clasamentelor), totaluri cumulative și medii mobile (sume cumulative, agregate per-partiție afișate alături de fiecare rând) și comparații rând-la-rând (LAG/LEAD pentru analiza perioadă-cu-perioadă, cum ar fi creșterea de la o lună la alta).
Acestea sunt nevoi analitice comune și valoroase (tabele de clasament, metrici cumulative, analiza tendințelor, compararea fiecărui rând cu media grupului său) pe care funcțiile de fereastră le gestionează elegant într-o singură interogare, în timp ce SQL-ul anterior erei window functions-ului necesita self-join-uri complexe sau subinterogări.
Înțelegerea sintaxei OVER (PARTITION BY ... ORDER BY ...) (definirea ferestrei), funcțiile de clasament, funcțiile agregate de fereastră (totaluri cumulative, agregate per-partiție) și LAG/LEAD (accesarea altor rânduri) acoperă toolkitul analitic puternic.
Deoarece analiza datelor și raportarea sofisticată sunt utilizări importante ale SQL, și deoarece funcțiile de fereastră sunt modalitatea modernă și puternică de a exprima clasamente, calcule în curs și comparații rând-la-rând (semnificativ mai capabile și elegante decât alternativele), stăpânirea funcțiilor de fereastră este cunoștință valoroasă, frecvent aplicată, pentru SQL analitic care distinge dezvoltatorii care pot scrie interogări sofisticate de date — o caracteristică a competenței SQL avansate și subiect comun în roluri axate pe date și interviuri.
