【发布时间】:2015-08-31 22:29:55
【问题描述】:
我刚开始使用 Teradata,我在 Teradata 中遇到了一个名为“Rows unbounded prior”的有序分析函数。我尝试了几个站点来了解该功能,但它们都使用了一个复杂的示例来解释相同的内容。 您能否为我提供一个幼稚的示例,以便我可以清楚地了解基础知识?
【问题讨论】:
标签: sql teradata window-functions analytic-functions
我刚开始使用 Teradata,我在 Teradata 中遇到了一个名为“Rows unbounded prior”的有序分析函数。我尝试了几个站点来了解该功能,但它们都使用了一个复杂的示例来解释相同的内容。 您能否为我提供一个幼稚的示例,以便我可以清楚地了解基础知识?
【问题讨论】:
标签: sql teradata window-functions analytic-functions
它是窗口函数的“框架”或“范围”子句,它们是 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) 之间的范围组成。 p>
当您编写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.
【讨论】:
ROWS UNBOUNDED PRECEDING 不是 Teradata 特定的语法,它是标准 SQL。它与ORDER BY 一起定义了计算结果的窗口。
从逻辑上讲,基于起始行和 结束行。
开始行和结束行可能是固定的或相对于 当前行基于以下关键字:
可能的计算类型包括:
所以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
【讨论】: