web-dev-qa-db-fra.com

A quoi sert ROWS UNBOUNDED PRECEDING dans Teradata?

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.

32
StrugglingCoder

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 .

75
Lukas Eder

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:

  • PRECEDENT NON LIMITE, toutes les lignes avant la ligne actuelle -> corrigées
  • UNBOUNDED FOLLOWING, toutes les lignes après la ligne en cours -> corrigées
  • x PRECEDING, x lignes avant la ligne en cours -> relative
  • y SUIVANT, y lignes après la ligne en cours -> relative

Les types de calcul possibles incluent:

  • Les lignes de début et de fin sont fixes, la fenêtre se compose de toutes les lignes d’une partition, par exemple. une somme de groupe, c'est-à-dire des rangées agrégées et détaillées
  • Une extrémité est fixe, l’autre par rapport à la ligne en cours, le nombre de lignes augmente ou diminue, par ex. un total cumulé, somme restante
  • Les lignes de début et de fin sont relatives à la ligne en cours, le nombre de lignes dans une fenêtre est fixe, par exemple. une moyenne mobile sur n lignes

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
41
dnoeth