Skip to main content
Les fonctions de fenêtre vous permettent d’effectuer des calculs sur un ensemble de lignes liées à la ligne en cours. Elles peuvent être utilisées pour effectuer des calculs similaires à ceux réalisés avec des fonctions d’agrégation, mais s’en distinguent par le fait qu’une fonction de fenêtre ne regroupe pas les lignes en une seule sortie ; au contraire, les lignes individuelles sont toujours renvoyées.

Fonctions de fenêtre standard

ClickHouse prend en charge la syntaxe SQL standard pour les fenêtres et les fonctions de fenêtre. Le tableau ci-dessous indique les fonctionnalités actuellement prises en charge :

Syntaxe

  • PARTITION BY - définit comment découper un jeu de résultats en groupes.
  • ORDER BY - définit comment ordonner les lignes à l’intérieur du groupe pendant le calcul de aggregate_function.
  • ROWS, RANGE ou GROUPS - définit les bornes d’un cadre, aggregate_function étant calculée dans ce cadre. ROWS compte les lignes physiques, RANGE compte les valeurs ORDER BY et GROUPS compte les groupes de pairs (lignes égales selon la clé ORDER BY).
  • WINDOW - permet à plusieurs expressions d’utiliser la même définition de fenêtre.

Fonctions utilisables uniquement comme fonctions de fenêtre

Les fonctions suivantes ne peuvent être utilisées que comme fonctions de fenêtre. La plupart sont des fonctions SQL standard ; lagInFrame, leadInFrame et nonNegativeDerivative sont des extensions de ClickHouse.

Exemples

Voyons quelques exemples d’utilisation des fonctions de fenêtre.

Numérotation des lignes

Fonctions d’agrégation

Comparez le salaire de chaque joueur à la moyenne de son équipe.
Comparez le salaire de chaque joueur au salaire le plus élevé de son équipe.

Partitionnement par colonne

Délimitation de la fenêtre

Frame GROUPS

Une frame GROUPS compte des groupes de pairs entiers — des ensembles de lignes égales selon la clé ORDER BY — plutôt que des lignes physiques (ROWS) ou des valeurs ORDER BY (RANGE). N PRECEDING et N FOLLOWING comptent N groupes de pairs avant et après le groupe de pairs de la ligne en cours, et chaque groupe de pairs inclus apporte toujours l’ensemble de ses lignes. La requête ci-dessous applique les mêmes limites 1 PRECEDING AND 1 FOLLOWING à des frames ROWS, RANGE et GROUPS. La colonne order contient des valeurs dupliquées et non consécutives ; les trois modes couvrent donc des lignes différentes :
Chaque mode interprète les limites différemment :
  • ROWS compte les lignes physiques ; la frame comporte donc au plus trois lignes adjacentes : la ligne en cours et une ligne de chaque côté.
  • RANGE compte les valeurs d’order ; 1 PRECEDING et 1 FOLLOWING couvrent donc les lignes dont l’order diffère d’au plus 1 de celui de la ligne en cours. Avec des écarts de 10, aucune ligne voisine n’est incluse ; la frame ne contient donc que les lignes ayant le même order que la ligne en cours.
  • GROUPS compte les groupes de pairs ; 1 PRECEDING et 1 FOLLOWING incluent donc toujours intégralement les groupes adjacents, quels que soient les écarts entre les valeurs d’order.

Exemples concrets

Les exemples suivants permettent de résoudre des problèmes courants rencontrés en situation réelle.

Salaire maximal/total par service

Somme cumulée

Moyenne mobile / glissante (sur 3 lignes)

Moyenne mobile / glissante (par tranches de 10 secondes)

Moyenne mobile / glissante (sur 10 jours)

La température est stockée avec une précision à la seconde, mais en utilisant Range et ORDER BY toDate(ts), nous formons un frame de 10 unités, et comme toDate(ts) est utilisé, l’unité est le jour.

Références

Issues GitHub

La feuille de route concernant la prise en charge initiale des fonctions de fenêtre est décrite dans cette issue. Toutes les issues GitHub liées aux fonctions de fenêtre portent le label comp-window-functions.

Tests

Ces tests contiennent des exemples de la grammaire actuellement prise en charge : https://github.com/ClickHouse/ClickHouse/blob/master/tests/performance/window_functions.xml https://github.com/ClickHouse/ClickHouse/blob/master/tests/queries/0_stateless/01591_window_functions.sql

Documentation de Postgres

https://www.postgresql.org/docs/current/sql-select.html#SQL-WINDOW https://www.postgresql.org/docs/devel/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS https://www.postgresql.org/docs/devel/functions-window.html https://www.postgresql.org/docs/devel/tutorial-window.html

Documentation de MySQL

https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html https://dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html https://dev.mysql.com/doc/refman/8.0/en/window-functions-frames.html
Dernière modification le 14 août 2026