【问题标题】:Teradata and MySQL behave different in OVER() and Partition By () ClausesTeradata 和 MySQL 在 OVER() 和 Partition By () 子句中的行为不同
【发布时间】:2019-04-25 10:40:39
【问题描述】:

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

【问题讨论】:

    标签: mysql teradata


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的意见。
    • 解决方案是:使用数据 (p_id, p_name, price) 作为 ( VALUES (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) ) SELECT p_id, p_name, sum(price) OVER (ORDER BY p_name ROWS UNBOUNDED PRECEDING) FROM data ORDER BY p_id跨度>
    猜你喜欢
    • 2015-11-29
    • 2011-03-07
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多