Je viens juste de commencer Teradata et je suis tombé sur une fonction analytique ordonnée appelée "Lignes non bornées précédentes" dans Teradata. J'ai essayé plusieurs sites pour en savoir plus sur la fonction, mais tous utilisent un exemple compliqué expliquant la même chose. Pourriez-vous s'il vous plaît me donner un exemple naïf afin que je puisse obtenir les bases claires.
Il s'agit de la clause "frame" ou "range" des fonctions de fenêtre, qui font partie du standard SQL et sont implémentées dans de nombreuses bases de données, y compris Teradata.
Un exemple simple consisterait à calculer le montant moyen dans un délai de trois jours. J'utilise la syntaxe PostgreSQL pour l'exemple, mais ce sera la même chose pour Teradata:
WITH data (t, a) AS (
VALUES(1, 1),
(2, 5),
(3, 3),
(4, 5),
(5, 4),
(6, 11)
)
SELECT t, a, avg(a) OVER (ORDER BY t ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
FROM data
ORDER BY t
... qui donne:
t a avg
----------
1 1 3.00
2 5 3.00
3 3 4.33
4 5 4.00
5 4 6.67
6 11 7.50
Comme vous pouvez le constater, chaque moyenne est calculée "sur" une image ordonnée composée de la plage entre la ligne précédente (1 preceding
) et la ligne suivante (1 following
).
Quand vous écrivez ROWS UNBOUNDED PRECEDING
, la limite inférieure du cadre est simplement infinie. Ceci est utile pour calculer des sommes (c'est-à-dire "totaux cumulés" ), par exemple:
WITH data (t, a) AS (
VALUES(1, 1),
(2, 5),
(3, 3),
(4, 5),
(5, 4),
(6, 11)
)
SELECT t, a, sum(a) OVER (ORDER BY t ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
FROM data
ORDER BY t
cédant ...
t a sum
---------
1 1 1
2 5 6
3 3 9
4 5 14
5 4 18
6 11 29
Voici une autre très bonne explication des fonctions de la fenêtre SQL .
ROWS UNBOUNDED PRECEDING
N'est pas une syntaxe spécifique à Teradata, c'est du SQL standard. Avec le ORDER BY
, Il définit la fenêtre dans laquelle le résultat est calculé.
Logiquement, une fonction d'agrégation fenêtrée est calculée pour chaque ligne de la partition en fonction de toutes les lignes d'un rang entre les lignes de début et de fin.
Les lignes de début et de fin peuvent être fixes ou relatives à la ligne actuelle en fonction des mots-clés suivants:
Les types de calcul possibles incluent:
Donc, SUM(x) OVER (ORDER BY col ROWS UNBOUNDED PRECEDING)
donne un somme cumulative ou total cumulé
11 -> 11
2 -> 11 + 2 = 13
3 -> 13 + 3 (or 11+2+3) = 16
44 -> 16 + 44 (or 11+2+3+44) = 60