我刚刚开始使用 Teradata,我在 Teradata 中遇到了一个名为"行无界前面"的有序分析函数。我尝试了几个网站来了解该功能,但它们都使用了一个复杂的示例来解释相同的功能。你能给我一个天真的例子,让我弄清楚基础知识吗?
它是窗口函数的"框架"或"范围"子句,它们是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
如您所见,每个平均值都是在有序帧上计算的,该有序帧由前一行(1 preceding
)和下一行(1 following
)之间的范围组成。
当你写ROWS UNBOUNDED PRECEDING
时,框架的下限简直是无限的。这在计算总和(即"运行总计")时很有用,例如:
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
这是对SQL窗口函数的另一个非常好的解释。
ROWS UNBOUNDED PRECEDING
不是特定于Teradata的语法,而是标准SQL。它与ORDER BY
一起定义了计算结果的窗口。
从逻辑上讲,根据起始行和结束行。
开始行和结束行可能是固定的,或者相对于基于以下关键字的当前行:
- 当前行
- ,当前行
- 无界前置,当前行之前的所有行 ->固定
- 无界跟随,当前行之后的所有行 ->固定 x
- 前,当前行之前的 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