在 Teradata 中,无界行前面的用途是什么



我刚刚开始使用 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

相关内容

  • 没有找到相关文章

最新更新