我刚刚开始学习Teradata,在Teradata中遇到了一个名为"Rows unbounded previous"的有序分析函数.我try 了几个网站来了解这个功能,但它们都使用了一个复杂的例子来解释相同的问题.

推荐答案

它是窗口函数的"frame"或"range"子句,它是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时,框架的下限就是无限的.这在计算总和(即"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

Sql相关问答推荐

SQL使最终结果显示两个表后的所有数据(匹配和不匹配)?

更新在两个或多个面中具有交点的面

从自定义日期和时间开始,每月具有给定状态的公司数量

如何更新SQLite数据库中的表?

基于多参数的SQL Server条件过滤

带日期函数的复合索引不允许只扫描索引吗?

每个学校 Select N个最新的行,但跳过同一学生的重复行

将伪数据插入Postgres表

通过UPDATE SELECT更新表时出现问题

Athena 计算从日期到当前时间戳的每月计数

删除重复记录但保留最新的SQL查询

Postgres更新增量之间的差异

在 PostgreSQL 中使用重音敏感排序进行重音不敏感搜索

在给定列中具有特定值的行与 SQL 中的总行数的比率

面对来自以下两个代码的不同输出

SQL - 使用子查询返回多行的 LIKE 命令

当没有任何行存在时,将一个表中的行插入到另一个表中的更好方法

在 SQL 中将行显示为列

Hive SQL如何获取加权样本数据?

除以表中的几个元素