什么是ROWS UNBOUNDED PRECEDING用于Teradata?

时间:2015-06-16 08:01:38

标签: sql teradata window-functions

我刚刚开始使用Teradata,我在Teradata遇到了一个名为“Rows unbounded preceding”的Ordered Analytical Function。我尝试了几个网站来了解这个功能,但是所有这些网站都使用了一个复杂的例子来解释它。能否请你给我一个天真的例子,以便我能清楚地了解基础知识。

2 个答案:

答案 0 :(得分:71)

它是"框架"或"范围"窗口函数的子句,它是SQL标准的一部分,并在许多数据库中实现,包括Teradata。

一个简单的例子就是计算三天内的平均金额。我使用PostgreSQL语法作为示例,但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

......产生:

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

正如您所看到的,每个平均值都计算在" over" 一个有序帧,包含前一行(1 preceding)和后续行之间的范围( 1 following)。

当你写ROWS UNBOUNDED PRECEDING时,帧的下界就是无限的。这在计算总和时很有用(例如"running totals"),例如:

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

...产生

t  a  sum
---------
1  1    1
2  5    6
3  3    9
4  5   14
5  4   18
6 11   29

Here's another very good explanations of SQL window functions

答案 1 :(得分:36)

ROWS UNBOUNDED PRECEDING没有特定于Teradata的语法,它是标准SQL。与ORDER BY一起,它定义了计算结果的窗口。

逻辑上,根据起始行和起始行之间的所有ROWS,为PARTITION中的每一行新计算一个窗口化聚合函数。 结束行。

开始和结束行可能是固定的或相对于 当前行基于以下关键字:

  • UNBOUNDED PRECEDING,当前行之前的所有行 - >修复
  • UNBOUNDED FOLLOWING,当前行之后的所有行 - >固定
  • x PRECEDING,当前行之前的x行 - >相对
  • y关注,当前行之后的y行 - >相对

可能的计算类型包括:

  • 开始行和结束行都是固定的,窗口由分区的所有行组成,例如,组合总和,即聚合加细节行
  • 一端固定,另一端相对于当前行,行数增加或减少,例如,剩余总额,剩余总和
  • 开始和结束行相对于当前行,窗口内的行数是固定的,例如,移动平均线超过 n

因此SUM(x) OVER (ORDER BY col ROWS UNBOUNDED PRECEDING)会产生累积总和正在运行总计

11 -> 11
 2 -> 11 +  2                = 13
 3 -> 13 +  3 (or 11+2+3)    = 16
44 -> 16 + 44 (or 11+2+3+44) = 60