Les funcions de finestra (o "window functions") són una característica poderosa de SQL que permet realitzar càlculs sobre un conjunt de files relacionades amb la fila actual. Aquestes funcions són molt útils per a tasques com el càlcul de sumes acumulades, mitjanes mòbils, classificacions i altres operacions que necessiten accedir a múltiples files per a cada fila del resultat.
Conceptes clau
Abans d'entrar en els detalls de les funcions de finestra, és important comprendre alguns conceptes clau:
- Partició: Un conjunt de files sobre les quals s'aplica la funció de finestra. És similar a un "GROUP BY", però no redueix el nombre de files del resultat.
- Ordre: L'ordre en què es processen les files dins de cada partició.
- Finestra: Un conjunt de files que es defineix en relació amb la fila actual.
Sintaxi bàsica
La sintaxi general per a una funció de finestra és:
<funció_de_finestra> OVER ( [PARTITION BY <columna1>, <columna2>, ...] [ORDER BY <columna1> [ASC|DESC], <columna2> [ASC|DESC], ...] [ROWS|RANGE BETWEEN <inici> AND <final>] )
Funcions de finestra comunes
ROW_NUMBER()
ROW_NUMBER()
Aquesta funció assigna un número únic a cada fila dins de la partició de la finestra.
SELECT columna1, columna2, ROW_NUMBER() OVER (PARTITION BY columna1 ORDER BY columna2) AS fila_num FROM taula;
RANK()
RANK()
Aquesta funció assigna un rang a cada fila dins de la partició de la finestra, amb possibles empats.
SELECT columna1, columna2, RANK() OVER (PARTITION BY columna1 ORDER BY columna2) AS rang FROM taula;
DENSE_RANK()
DENSE_RANK()
Similar a RANK()
, però sense salts en els rangs en cas d'empats.
SELECT columna1, columna2, DENSE_RANK() OVER (PARTITION BY columna1 ORDER BY columna2) AS rang_dens FROM taula;
SUM()
SUM()
Calcula la suma acumulada de valors dins de la finestra.
SELECT columna1, columna2, SUM(columna2) OVER (PARTITION BY columna1 ORDER BY columna2) AS suma_acumulada FROM taula;
AVG()
AVG()
Calcula la mitjana acumulada de valors dins de la finestra.
SELECT columna1, columna2, AVG(columna2) OVER (PARTITION BY columna1 ORDER BY columna2) AS mitjana_acumulada FROM taula;
Exemples pràctics
Exemple 1: Classificació de vendes per producte
Suposem que tenim una taula vendes
amb les següents columnes: producte_id
, data_venda
i quantitat
.
SELECT producte_id, data_venda, quantitat, RANK() OVER (PARTITION BY producte_id ORDER BY data_venda) AS rang_venda FROM vendes;
Exemple 2: Suma acumulada de vendes per producte
SELECT producte_id, data_venda, quantitat, SUM(quantitat) OVER (PARTITION BY producte_id ORDER BY data_venda) AS suma_acumulada FROM vendes;
Exercicis pràctics
Exercici 1: Classificació de productes per vendes
Enunciat: Utilitzant la taula vendes
, classifica els productes segons la quantitat total venuda en cada data.
SELECT producte_id, data_venda, quantitat, RANK() OVER (PARTITION BY data_venda ORDER BY quantitat DESC) AS rang_venda FROM vendes;
Exercici 2: Mitjana acumulada de vendes per producte
Enunciat: Calcula la mitjana acumulada de vendes per a cada producte en cada data.
SELECT producte_id, data_venda, quantitat, AVG(quantitat) OVER (PARTITION BY producte_id ORDER BY data_venda) AS mitjana_acumulada FROM vendes;
Errors comuns i consells
- Oblidar la clàusula
ORDER BY
: Moltes funcions de finestra necessiten una clàusulaORDER BY
per funcionar correctament. - Confondre
PARTITION BY
ambGROUP BY
: Recorda quePARTITION BY
no redueix el nombre de files del resultat. - No especificar correctament la finestra: Assegura't de definir correctament la finestra per obtenir els resultats esperats.
Conclusió
Les funcions de finestra són una eina poderosa per a l'anàlisi de dades en SQL. Permeten realitzar càlculs complexos de manera eficient i són essencials per a moltes aplicacions analítiques. Amb la pràctica, podràs dominar aquestes funcions i utilitzar-les per resoldre problemes complexos de manera elegant i eficient.
Curs de SQL
Mòdul 1: Introducció a SQL
Mòdul 2: Consultes bàsiques de SQL
Mòdul 3: Treballar amb múltiples taules
Mòdul 4: Filtratge avançat de dades
- Utilitzar LIKE per a coincidències de patrons
- Operadors IN i BETWEEN
- Valors NULL i IS NULL
- Agrupar dades amb GROUP BY
- Clàusula HAVING
Mòdul 5: Manipulació de dades
Mòdul 6: Funcions avançades de SQL
Mòdul 7: Subconsultes i consultes niades
- Introducció a les subconsultes
- Subconsultes correlacionades
- EXISTS i NOT EXISTS
- Utilitzar subconsultes en les clàusules SELECT, FROM i WHERE
Mòdul 8: Índexs i optimització del rendiment
- Comprendre els índexs
- Crear i gestionar índexs
- Tècniques d'optimització de consultes
- Analitzar el rendiment de les consultes
Mòdul 9: Transaccions i concurrència
- Introducció a les transaccions
- Propietats ACID
- Instruccions de control de transaccions
- Gestionar la concurrència
Mòdul 10: Temes avançats
Mòdul 11: SQL en la pràctica
- Casos d'ús del món real
- Millors pràctiques
- SQL per a l'anàlisi de dades
- SQL en el desenvolupament web