Teradata和MySQL在OVER()和Partition By()子句中的行为不同
我想了解为什么同一个查询在Teradata和我的SQL中产生不同的结果。 我试图为运行total编写一个查询,每个DB都给了我不同的解决方案 代码如下:Teradata和MySQL在OVER()和Partition By()子句中的行为不同,mysql,teradata,Mysql,Teradata,我想了解为什么同一个查询在Teradata和我的SQL中产生不同的结果。 我试图为运行total编写一个查询,每个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
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没有正确地执行窗口功能。teradata在成为标准SQL 99的一部分(使用专有语法)之前,大约20年前实现了一些窗口功能,这种行为是一种遗留行为
在标准SQL(和MySQL)中,当您指定
ORDER BY
时,窗口默认为RANGE UNBOUNDED PECEDING
,Teradata不支持该窗口,该窗口默认为RANGE介于无界前向和无界后向之间。要获得预期的结果,您必须在前面添加行无界
,这也建议在其他DBMS中超过范围
(除非您实际需要范围
)的结果,因为行
更容易计算 Teradata在成为标准SQL 99的一部分(使用专有语法)之前,大约20年前实现了一些窗口函数,这种行为是一种遗留行为
在标准SQL(和MySQL)中,当您指定ORDER BY
时,窗口默认为RANGE UNBOUNDED PECEDING
,Teradata不支持该窗口,该窗口默认为RANGE介于无界前向和无界后向之间。要获得预期的结果,您必须在前面添加行无界
,这也建议在其他DBMS中超过范围
(除非您实际需要范围
)的结果,因为行
更容易计算 感谢您的输入。解决方案是:使用数据(p_id,p_名称,价格)作为(值(1,'p1',34),(2,'p1',56),(3,'p1',65),(4,'p1',12),(5,'p1',34),(6,'p1',78),(7,'p1',23),(8,'p1',55),(9,'p1',34),(10,'p1',66))选择p_id,p_名称,感谢您的输入。解决方案是:使用数据(p_id,p_名称,价格)作为(值(1,'p1',34),(2,'p1',56),(3,'p1',65),(4,'p1',12),(5,'p1',34),(6,'p1',78),(1,'p1',34),(p_名称,行前面无边界的顺序),(7,'p1',23),(8,'p1',55),(9,'p1',34),(10,'p1',66))从数据顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序顺序