Teradata和MySQL在OVER()和Partition By()子句中表现不同

Rav*_*avi 1 mysql teradata

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

以下是代码:

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);
Run Code Online (Sandbox Code Playgroud)

我在MySQL和Teradata中使用的查询

select p_id, p_name, SUM(price) OVER ( partition by p_name order by p_id)  Running_Total
from runn_tot;
Run Code Online (Sandbox Code Playgroud)

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 |
+------+--------+---------------+
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我试图理解为什么MySQL能够获得正确的运行总数并且teradata没有正确地执行窗口功能.

dno*_*eth 5

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

在标准SQL(和MySQL)中指定ORDER BY默认为RANGE UNBOUNDED PECEDINGTeradata 的窗口默认值,默认为RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.要获得预期的结果,您必须添加ROWS UNBOUNDED PRECEDING,这RANGE在其他DBMS中也是推荐的(除非您实际需要a的结果RANGE),因为ROWS更容易计算.