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:

  1. 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.
  2. Ordre: L'ordre en què es processen les files dins de cada partició.
  3. 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

  1. 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;

  1. 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;

  1. 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;

  1. 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;

  1. 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

  1. Oblidar la clàusula ORDER BY: Moltes funcions de finestra necessiten una clàusula ORDER BY per funcionar correctament.
  2. Confondre PARTITION BY amb GROUP BY: Recorda que PARTITION BY no redueix el nombre de files del resultat.
  3. 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

Mòdul 5: Manipulació de dades

Mòdul 6: Funcions avançades de SQL

Mòdul 7: Subconsultes i consultes niades

Mòdul 8: Índexs i optimització del rendiment

Mòdul 9: Transaccions i concurrència

Mòdul 10: Temes avançats

Mòdul 11: SQL en la pràctica

Mòdul 12: Projecte final

© Copyright 2024. Tots els drets reservats