Mysql 窗口函数ROW_NUMBER()通过变量RUNNING TOTAL更改处理顺序
当我使用窗口函数ROW\ U NUMBER添加一列时,我看到顺序发生了变化 结果是运行总数不正确@ONorderQTYrunner 有人能解释为什么行号改变了排序顺序,导致运行total时出错吗 下面带有行号的查询返回了第一行和第二行的意外RUNNINGtotal值: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
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;