Que sont les fonctions de fenêtre ?
Les fonctions de fenêtre permettent aux utilisateurs d'effectuer des calculs sur des partitions (c'est-à-dire des sous-groupes ou des sections) d'un ensemble de résultats, généralement une table ou les résultats d'une autre requête. Contrairement aux fonctions d'agrégation traditionnelles, qui ne renvoient qu'une seule valeur pour chaque groupe défini dans la requête, les fonctions de fenêtre renvoient une seule valeur pour chaque ligne d'entrée.
En quoi les fonctions de fenêtre sont-elles utiles ?
Les fonctions de fenêtre augmentent l'efficacité et réduisent la complexité des requêtes qui analysent les partitions (fenêtres) d'un ensemble de données en offrant une alternative aux concepts SQL plus complexes, par ex. requêtes dérivées. Les cas d'utilisation courants incluent :
- Classement des résultats dans une fenêtre spécifique (par exemple, classement par groupe)
- Accéder aux données d'une autre ligne dans une fenêtre spécifique (par exemple, rapport d'une période à l'autre)
- Agrégation dans une fenêtre spécifique (par exemple, totaux cumulés) :
Comment utiliser les fonctions de fenêtre
Les fonctions de fenêtre sont lancées avec le OVER
clause, et sont configurés à l'aide de trois concepts :
- partition de fenêtre (
PARTITION BY
) - regroupe les lignes en partitions - ordre des fenêtres (
ORDER BY
) - définit l'ordre ou la séquence des lignes dans chaque fenêtre - cadre de fenêtre (
ROWS
) - définit la fenêtre en utilisant un décalage par rapport à la ligne spécifiée
Présentation de la syntaxe
function (expression) OVER
( [ PARTITION BY expression_list ]
[ ORDER BY order_list ]
[ ROWS frame_clause ])
Définitions
- expression_list :liste d'expressions séparées par des virgules, généralement des noms de colonnes
- order_list :liste d'expressions séparées par des virgules, généralement des noms de colonnes
- frame_clause :définissez le décalage à l'aide de
CURRENT ROW
,_value_ PRECEDING
,UNBOUNDED PRECEDING
,_value_ FOLLOWING
,UNBOUNDED FOLLOWING
Exemples
Classement :classement par groupe
SELECT
campaign
, month
, total_cost
, rank() OVER (PARTITION BY month ORDER BY month DESC, total_cost DESC) as "rank"
FROM Cost_by_Month
LIMIT 8
Ligne précédente :analyse période sur période
SELECT
campaign
, month
, total_cost
, LAG(total_cost, 1) OVER (ORDER BY campaign, month) as "previous total cost"
FROM Cost_by_Month
WHERE campaign = 'TV'
LIMIT 4
Agrégation dans une fenêtre :totaux cumulés
SELECT
campaign, month, monthly_cost
, sum(monthly_cost) OVER (PARTITION BY campaign ORDER BY month ROWS BETWEEN UNBOUNDED
PRECEDING and CURRENT ROW) as "running cost total"
FROM Cost_by_Month
Liste de la documentation et des fonctions :
Veuillez noter que des différences subtiles d'utilisation et de syntaxe existent d'une base de données à l'autre. Pour obtenir des informations spécifiques à votre mise en œuvre, veuillez utiliser la documentation spécifique à la source fournie ci-dessous.
Postgres
- Tutoriel
- Fonctions
Redshift
- Tutoriel
- Fonctions
Oracle
- Tutoriel
SQLServer
- Tutoriel
BigQuery
- Tutoriel