Teradata 和 MySQL 在 OVER() 和 Partition By () 子句中的行为不同

Teradata and MySQL behave different in OVER() and Partition By () Clauses

我想了解为什么相同的查询在 Teradata 和我的 SQL 中产生不同的结果。 我正在尝试编写 运行 总计的查询,每个数据库都给我不同的解决方案。

代码如下:

CREATE TABLE runn_tot (p_id int, p_name varchar(10), price decimal(5,2));

insert into runn_tot values (1,'p1',34);
insert into runn_tot values (2,'p1',56);
insert into runn_tot values (3,'p1',65);
insert into runn_tot values (4,'p1',12);
insert into runn_tot values (5,'p1',34);
insert into runn_tot values (6,'p1',78);
insert into runn_tot values (7,'p1',23);
insert into runn_tot values (8,'p1',55);
insert into runn_tot values (9,'p1',34);
insert into runn_tot values (10,'p1',66);

我在 MySQL 和 Teradata

中使用的查询
select p_id, p_name, SUM(price) OVER ( partition by p_name order by p_id)  Running_Total
from runn_tot;

来自 MySQL 的结果:

+------+--------+---------------+
| p_id | p_name | Running_Total |
+------+--------+---------------+
|    1 | p1     |         34.00 |
|    2 | p1     |         90.00 |
|    3 | p1     |        155.00 |
|    4 | p1     |        167.00 |
|    5 | p1     |        201.00 |
|    6 | p1     |        279.00 |
|    7 | p1     |        302.00 |
|    8 | p1     |        357.00 |
|    9 | p1     |        391.00 |
|   10 | p1     |        457.00 |
+------+--------+---------------+

来自 Teradata 的结果:

1   p1  457.00
2   p1  457.00
3   p1  457.00
4   p1  457.00
5   p1  457.00
6   p1  457.00
7   p1  457.00
8   p1  457.00
9   p1  457.00
10  p1  457.00

我想了解为什么 MySQL 能够获得正确的 运行 总数,而 teradata 没有正确执行 window 功能。

Teradata 在大约 20 年前实现了一些 Window 函数,然后才成为标准 SQL 99 的一部分(使用专有语法),这种行为是一种遗留问题。

在标准 SQL(和 MySQL)中,当您指定 ORDER BY 时,window 默认为 RANGE UNBOUNDED PECEDING,Teradata 不支持它默认为 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING。要获得预期的结果,您必须添加 ROWS UNBOUNDED PRECEDING,在其他 DBMS 中也推荐使用 RANGE(除非您确实需要 RANGE 的结果),因为 ROWS更容易计算。