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 BYper funcionar correctament. - Confondre
PARTITION BYambGROUP BY: Recorda quePARTITION BYno 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
