Mysql 窗口函数ROW_NUMBER()通过变量RUNNING TOTAL更改处理顺序

Mysql 窗口函数ROW_NUMBER()通过变量RUNNING TOTAL更改处理顺序,mysql,sql,mariadb,window-functions,cumulative-sum,Mysql,Sql,Mariadb,Window Functions,Cumulative Sum,当我使用窗口函数ROW\ U NUMBER添加一列时,我看到顺序发生了变化 结果是运行总数不正确@ONorderQTYrunner 有人能解释为什么行号改变了排序顺序,导致运行total时出错吗 下面带有行号的查询返回了第一行和第二行的意外RUNNINGtotal值: 1 57 A-123 69 4000 2020-06-10 4500 2 32 A-123 67 500 2020-07-01 500 3 59 A-123 69 2000

当我使用窗口函数ROW\ U NUMBER添加一列时,我看到顺序发生了变化

结果是运行总数不正确@ONorderQTYrunner

有人能解释为什么行号改变了排序顺序,导致运行total时出错吗

下面带有行号的查询返回了第一行和第二行的意外RUNNINGtotal值:

1  57   A-123   69  4000    2020-06-10  4500
2  32   A-123   67  500     2020-07-01  500
3  59   A-123   69  2000    2020-07-15  6500
4  60   A-123   69  2000    2020-08-15  8500
如我所料,如果没有ROW_编号,将返回此信息:

57  A-123   69  4000    2020-06-10  4000
32  A-123   67  500     2020-07-01  4500
59  A-123   69  2000    2020-07-15  6500
60  A-123   69  2000    2020-08-15  8500
编辑: Gordon Linoff的以下建议使用此函数代替内联变量赋值,纠正了该问题:

SUM(PO.QTY) OVER (ORDER BY PO.DOCKdate) as RUNNINGtotalfollowing 
已更正运行总结果:

1  57   A-123   69  4000    2020-06-10  4000
2  32   A-123   67  500     2020-07-01  4500
3  59   A-123   69  2000    2020-07-15  6500
4  60   A-123   69  2000    2020-08-15  8500
结果,问题的根本原因: 已弃用的行内变量赋值。
注意:这是MySql中的一个问题,MySql SELECT语句中的MariaDB

变量赋值现在已被弃用。使用适当的累计金额:

SELECT DISTINCT 
       ROW_NUMBER() OVER (ORDER BY DOCKdate ASC) AS ONorderROWindex,
       PO.UniKey, PO.PARTnumber, PO.POnumber, PO.QTY, PO.DOCKdate,
       SUM(PO.QTY) OVER (ORDER BY PO.DOCKdate) as RUNNINGtotal
FROM PURCHASEorders PO
WHERE PO.PARTnumber = @PARTnumber 
ORDER BY PO.DOCKdate ASC;

我怀疑是否真的需要SELECT DISTINCT,但那将是另一回事。

根据您的建议,将SUMPO.QTY添加到PO.DOCKdate的ORDER上作为RUNNINGtotal,我得到了正确的RUNNINGtotal,但ONorderROWindex不符合DOCKdate的ORDER。@gcronin774。当然应该是这样。行号有一个ORDER BY子句。DBfiddle不适用于MySQL 8,但它肯定适用于MariaDB:。你是对的,Gordon。我误读了我的数据和我的例子。该问题已被编辑以澄清解决方案。@gcronin774。如果这确实回答了你的问题,你应该接受答案。
1  57   A-123   69  4000    2020-06-10  4000
2  32   A-123   67  500     2020-07-01  4500
3  59   A-123   69  2000    2020-07-15  6500
4  60   A-123   69  2000    2020-08-15  8500
SELECT DISTINCT 
       ROW_NUMBER() OVER (ORDER BY DOCKdate ASC) AS ONorderROWindex,
       PO.UniKey, PO.PARTnumber, PO.POnumber, PO.QTY, PO.DOCKdate,
       SUM(PO.QTY) OVER (ORDER BY PO.DOCKdate) as RUNNINGtotal
FROM PURCHASEorders PO
WHERE PO.PARTnumber = @PARTnumber 
ORDER BY PO.DOCKdate ASC;