Fonctions de fenêtre standard
| Fonctionnalité | Pris en charge ? | Commentaire |
|---|---|---|
Spécification de fenêtre ad hoc (count(*) OVER (PARTITION BY id ORDER BY time DESC)) | ✅ | |
Expressions faisant intervenir des fonctions de fenêtre, par ex. (count(*) OVER ()) / 2 | ✅ | |
Clause WINDOW (SELECT ... FROM table WINDOW w AS (PARTITION BY id)) | ✅ | |
Cadre ROWS | ✅ | |
Cadre RANGE | ✅ | Utilisé par défaut lorsqu’un cadre n’est pas explicitement spécifié (RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW). |
Syntaxe INTERVAL pour un cadre RANGE OFFSET de type DateTime | ❌ | Indiquez plutôt le nombre de secondes (RANGE fonctionne avec n’importe quel type numérique). |
Cadre GROUPS | ❌ | |
Calcul de fonctions d’agrégation sur un cadre (sum(value) OVER (ORDER BY time)) | ✅ | Toutes les fonctions d’agrégation sont prises en charge. |
rank(), dense_rank()/denseRank(), row_number() | ✅ | |
percent_rank()/percentRank() | ✅ | Calcule efficacement le rang relatif d’une valeur au sein d’une partition. Remplace le calcul SQL manuel, plus verbeux et plus coûteux en calcul, exprimé par ifNull((rank() OVER (PARTITION BY x ORDER BY y) - 1) / nullif(count(1) OVER (PARTITION BY x) - 1, 0), 0). |
cume_dist() | ✅ | Calcule la distribution cumulée d’une valeur au sein d’un groupe de valeurs. Renvoye le pourcentage de lignes dont les valeurs sont inférieures ou égales à celle de la ligne en cours. |
lag/lead(value, offset) | ✅ | Vous pouvez également utiliser l’une des solutions de contournement suivantes : 1) any(value) OVER (... ROWS BETWEEN <offset> PRECEDING AND <offset> PRECEDING), ou FOLLOWING à la place de PRECEDING pour lead 2) lagInFrame/leadInFrame, qui sont analogues mais respectent le cadre de la fenêtre. Pour obtenir un comportement identique à lag/lead, utilisez ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING. |
ntile(buckets) | ✅ | Spécifiez la fenêtre, par exemple, ainsi : (PARTITION BY x ORDER BY y ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING). |
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 or RANGE- définit les bornes d’un cadre, aggregate_function étant calculée dans ce cadre.WINDOW- permet à plusieurs expressions d’utiliser la même définition de fenêtre.
Fonctions utilisables uniquement comme fonctions de fenêtre
lagInFrame, leadInFrame et nonNegativeDerivative sont des extensions de ClickHouse.
| Fonction | Description |
|---|---|
row_number() | Numérote la ligne actuelle dans sa partition à partir de 1. |
first_value(x) | Renvoie la première valeur évaluée dans son cadre ordonné. |
last_value(x) | Renvoie la dernière valeur évaluée dans son cadre ordonné. |
nth_value(x, offset) | Renvoie la première valeur non-NULL évaluée sur la n-ième ligne (offset) de son cadre ordonné. |
rank() | Attribue un rang à la ligne actuelle dans sa partition avec des écarts. |
dense_rank() | Attribue un rang à la ligne actuelle dans sa partition sans écarts. |
lagInFrame(x) | Renvoie une valeur évaluée sur la ligne située à un décalage physique spécifié avant la ligne actuelle dans le cadre ordonné. |
leadInFrame(x) | Renvoie une valeur évaluée sur la ligne située au nombre de lignes indiqué après la ligne actuelle dans le cadre ordonné. |
nonNegativeDerivative(metric_column, timestamp_column[, INTERVAL X UNITS]) | Calcule la dérivée non négative de metric_column par rapport à timestamp_column. Spécifique à ClickHouse. |
Exemples
Numérotation des lignes
Fonctions d’agrégation
Partitionnement par colonne
Délimitation de la fenêtre
Exemples concrets
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)
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.