window 函数 ROW_NUMBER() 更改处理 ORDER BY 变量 运行 TOTAL
window Function ROW_NUMBER() changes processing ORDER BY with variable RUNNING TOTAL
当我使用 window 函数 ROW_NUMBER() 添加列时,我看到顺序发生了变化。
结果 运行 总数不正确。 (@ONorderQTYrunner)
谁能解释为什么 ROW_NUMBER() 会更改排序顺序并导致 运行 总计错误?
下面的查询(使用 ROW_NUMBER())返回了意外的 运行 第一行和第二行的总值:
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_NUMBER() 返回这个,如我所料:
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
CREATE TABLE IF NOT EXISTS `PURCHASEorders` (
`UniKey` int(11) NOT NULL AUTO_INCREMENT,
`PARTnumber` varchar(255) DEFAULT NULL,
`POnumber` varchar(255) NOT NULL,
`QTY` double DEFAULT 0,
`DOCKdate` date DEFAULT NULL,
PRIMARY KEY (`UniKey`),
KEY `PartNumber` (`PARTnumber`),
KEY `POnumber` (`POnumber`)
) DEFAULT CHARSET=utf8;
INSERT INTO `PURCHASEorders` (`UniKey`, `PARTnumber`,`POnumber`, `QTY`, `DOCKdate`) VALUES
('32', 'A-123', 67, 500, '2020-07-01 12:00:00'),
('57', 'A-123', 69, 4000,'2020-06-10 12:00:00'),
('59', 'A-123', 69, 2000,'2020-07-15 12:00:00'),
('60', 'A-123', 69, 2000,'2020-08-15 12:00:00');
SET @PARTnumber = 'A-123';
SET @ONorderQTYrunner =0;
SELECT DISTINCT
ROW_NUMBER() OVER(ORDER BY DOCKdate ASC) AS ONorderROWindex,
PO.UniKey,
PO.PARTnumber,
PO.POnumber,
PO.QTY,
PO.DOCKdate,
@ONorderQTYrunner:= @ONorderQTYrunner + PO.QTY AS RUNNINGtotal
FROM PURCHASEorders PO
WHERE PO.PARTnumber = @PARTnumber
ORDER BY PO.DOCKdate ASC
编辑:
按照 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 和 MariaDB
中的一个问题
MySQL SELECT
语句中的变量赋值现已弃用。使用合适的累计和:
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
是否真的需要,但那是另一回事。
当我使用 window 函数 ROW_NUMBER() 添加列时,我看到顺序发生了变化。
结果 运行 总数不正确。 (@ONorderQTYrunner)
谁能解释为什么 ROW_NUMBER() 会更改排序顺序并导致 运行 总计错误?
下面的查询(使用 ROW_NUMBER())返回了意外的 运行 第一行和第二行的总值:
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_NUMBER() 返回这个,如我所料:
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
CREATE TABLE IF NOT EXISTS `PURCHASEorders` (
`UniKey` int(11) NOT NULL AUTO_INCREMENT,
`PARTnumber` varchar(255) DEFAULT NULL,
`POnumber` varchar(255) NOT NULL,
`QTY` double DEFAULT 0,
`DOCKdate` date DEFAULT NULL,
PRIMARY KEY (`UniKey`),
KEY `PartNumber` (`PARTnumber`),
KEY `POnumber` (`POnumber`)
) DEFAULT CHARSET=utf8;
INSERT INTO `PURCHASEorders` (`UniKey`, `PARTnumber`,`POnumber`, `QTY`, `DOCKdate`) VALUES
('32', 'A-123', 67, 500, '2020-07-01 12:00:00'),
('57', 'A-123', 69, 4000,'2020-06-10 12:00:00'),
('59', 'A-123', 69, 2000,'2020-07-15 12:00:00'),
('60', 'A-123', 69, 2000,'2020-08-15 12:00:00');
SET @PARTnumber = 'A-123';
SET @ONorderQTYrunner =0;
SELECT DISTINCT
ROW_NUMBER() OVER(ORDER BY DOCKdate ASC) AS ONorderROWindex,
PO.UniKey,
PO.PARTnumber,
PO.POnumber,
PO.QTY,
PO.DOCKdate,
@ONorderQTYrunner:= @ONorderQTYrunner + PO.QTY AS RUNNINGtotal
FROM PURCHASEorders PO
WHERE PO.PARTnumber = @PARTnumber
ORDER BY PO.DOCKdate ASC
编辑: 按照 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 和 MariaDB
中的一个问题 MySQL SELECT
语句中的变量赋值现已弃用。使用合适的累计和:
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
是否真的需要,但那是另一回事。