我找到了许多其他类似查询的答案,但没有一个符合我的要求,因此问题。
一,数据:
orderid type year change
1111 1 2018 333
1111 2 2018 4652
1111 1 2019 3645
1111 3 2019 444
2222 1 2018 6451
列orderid,type和year上有一个连接键。因此,对于某种类型,每个订单每年可以有一个条目。
现在,期望的结果(选项1):
orderid type year change
1111 2 2018 4652
1111 1 2019 3645
我要找的是每年给定订单的最大'变化'值。类型无关紧要。 '1111'是传递给查询的样本订单。
如果第一个挑战可以进一步改善,理想情况下我希望从上面的答案中得到改变的总和。所以理想的结果应该是这样的(选项2):
orderid change
1111 8297
我还没有尝试过第二个答案,从技术上来说应该是对结果的一个额外查询的简单包装,以汇总返回的更改列。但到目前为止我对第一个问题(并添加 - 没有成功)的尝试是这样的:
SELECT t1.*
FROM table1 t1
LEFT JOIN table1 t2
ON t1.orderid = t2.orderid AND t1.year = t2.year AND t1.change > t2.change
WHERE t2.change IS NULL
AND t1.orderid = '1111'
这个查询返回的结果不完全是期望的结果,其中一个最大值是正确的,但另一个不是:
orderid type year change
1111 1 2018 333
1111 1 2019 3645
这里是。现在谁想要保存我的周五晚上?
总是非常感谢帮助!
更新1:我包括一个上面提到的所有内容:SQLFiddle
您的SQLFiddle不起作用有两个原因。首先,最重要的是,你宣布你的change
值为VARCHAR
而不是INT
。因此,MySQL认为444
> 3645
。其次,JOIN
条件应该是t1.change < t2.change
,而不是t1.change > t2.change
。请参阅updated SQLFiddle,它会给出您想要的结果:
orderid type year change
1111 2 2018 4652
1111 1 2019 3645
如果该字段必须保持VARCHAR
,则需要将JOIN
条件更改为
CAST(t1.change AS UNSIGNED) < CAST(t2.change AS UNSIGNED)
要获得更改的SUM,只需将查询用作子查询,SUM
更改和GROUP BY orderid
:
SELECT orderid, SUM(`change`) AS total_change
FROM (SELECT t1.*
FROM table1 t1
LEFT JOIN table1 t2
ON t1.orderid = t2.orderid AND t1.year = t2.year AND t1.change < t2.change
WHERE t2.change IS NULL AND t1.orderid = '1111') t
GROUP BY orderid
输出:
orderid total_change
1111 8297
当您尝试比较值时,您的问题是qazxsw poi类型。
因此,比较时需要VARCHAR
值或CAST
。
change your schema
ALTER TABLE table1 MODIFY COLUMN `change` INT;
http://sqlfiddle.com/#!9/b2786a/6