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

标签 mysql teradata

我想了解为什么相同的查询在 Teradata 和 My 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 没有正确执行窗口函数。

最佳答案

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

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

关于mysql - Teradata 和 MySQL 在 OVER() 和 Partition By () 子句中的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53436163/

相关文章:

php - Mysql限制

sas - 使用 Fast LOAD 将 SAS 数据集加载到 Teradata 表中

php - 基本的 PHP 问题,代码不会运行! (没有错误只是空白)

java - hsqldb 中的 mysql 方言

mysql - Estado HTTP 404-/pentaho/首页

sql - 带有 Ranking 函数的 Case 语句

teradata - Teradata Kylo 产品发生了什么变化?

sql - 根据 teradata 中表 2 的值更新表 1

sql - 除以两个数字时,sql数据类型错误

mysql查询在mysql查询中以m/d/y格式计算出生日期的年龄