【问题标题】:What is ROWS UNBOUNDED PRECEDING used for in Teradata?Teradata 中的 ROWS UNBOUNDED PRECEDING 用于什么?
【发布时间】:2015-08-31 22:29:55
【问题描述】:

我刚开始使用 Teradata,我在 Teradata 中遇到了一个名为“Rows unbounded prior”的有序分析函数。我尝试了几个站点来了解该功能,但它们都使用了一个复杂的示例来解释相同的内容。 您能否为我提供一个幼稚的示例,以便我可以清楚地了解基础知识?

【问题讨论】:

    标签: sql teradata window-functions analytic-functions


    【解决方案1】:

    它是窗口函数的“框架”或“范围”子句,它们是 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.

    【讨论】:

      【解决方案2】:

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

      从逻辑上讲,基于起始行和 结束行。

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

      • CURRENT ROW,当前行
      • UNBOUNDED PRECEDING,当前行之前的所有行 -> 已修复
      • UNBOUNDED FOLLOWING,当前行之后的所有行 -> 已修复
      • x PRECEDING,当前行前 x 行 -> 相对
      • y FOLLOWING,当前行之后的 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
      

      【讨论】:

      • 感谢您解释每个术语。喜欢它。
      猜你喜欢
      • 2021-02-03
      • 2021-01-30
      • 2019-10-09
      • 2017-03-22
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 2015-01-03
      相关资源
      最近更新 更多