Str*_*der 33 sql teradata window-functions
我刚刚开始使用Teradata,我在Teradata遇到了一个名为"Rows unbounded preceding"的Ordered Analytical Function.我尝试了几个网站来了解这个功能,但是所有这些网站都使用了一个复杂的例子来解释它.能否请你给我一个天真的例子,以便我能清楚地了解基础知识.
Luk*_*der 78
它是窗口函数的"框架"或"范围"子句,它是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
Run Code Online (Sandbox Code Playgroud)
...产生:
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
Run Code Online (Sandbox Code Playgroud)
如您所见,每个平均值都是在一个有序帧"上方"计算的,该有序帧由前一行(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
Run Code Online (Sandbox Code Playgroud)
产生...
t a sum
---------
1 1 1
2 5 6
3 3 9
4 5 14
5 4 18
6 11 29
Run Code Online (Sandbox Code Playgroud)
dno*_*eth 42
ROWS UNBOUNDED PRECEDING
没有特定于Teradata的语法,它是标准SQL.与ORDER BY
它一起定义了计算结果的窗口.
逻辑上,基于起始行和结束行之间的所有ROW,为PARTITION中的每一行新计算窗口化聚合函数.
根据以下关键字,开始和结束行可能是固定的或相对于当前行:
可能的计算方式包括:
因此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
Run Code Online (Sandbox Code Playgroud)