MySQL获取多个列上连接的每个组的最大值
对于其他类似的问题,我找到了很多答案,但没有一个符合我的要求,因此我提出了这个问题 首先,数据:MySQL获取多个列上连接的每个组的最大值,mysql,max,left-join,grouping,Mysql,Max,Left Join,Grouping,对于其他类似的问题,我找到了很多答案,但没有一个符合我的要求,因此我提出了这个问题 首先,数据: 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、
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):
我要寻找的是每年给定订单的最大“变化”值。类型不重要。”1111'是传递给查询的示例订单
如果第一个挑战可以进一步改进,理想情况下,我希望从上面的答案中得到更改的总和。因此理想的结果应该如下所示(选项2):
我还没有尝试得到第二个答案,从技术上讲,这应该是对结果的附加查询的简单包装,以对返回的更改列求和。但到目前为止,我试图回答第一个问题(并补充一点,但没有成功)是:
此查询返回的结果不完全是期望的结果,其中一个最大值正确,但另一个不正确:
orderid type year change
1111 1 2018 333
1111 1 2019 3645
给你。现在谁来救我的星期五晚上
帮助总是很感激的
更新1:
我把上面的所有内容都包括在内:
您的SQLFiddle无法工作有两个原因。首先,也是最重要的一点,您将
change
值声明为VARCHAR
,而不是INT
。因此,MySQL认为444
3645
。其次,JOIN
条件应该是t1.change
,而不是t1.change>t2.change
。请参阅,其中提供了所需的结果:
orderid type year change
1111 2 2018 4652
1111 1 2019 3645
如果字段必须保持为VARCHAR
,则需要将JOIN
条件更改为
CAST(t1.change AS UNSIGNED) < CAST(t2.change AS UNSIGNED)
输出:
orderid total_change
1111 8297
您的SQLFiddle无法工作有两个原因。首先,也是最重要的一点,您将
change
值声明为VARCHAR
,而不是INT
。因此,MySQL认为444
3645
。其次,JOIN
条件应该是t1.change
,而不是t1.change>t2.change
。请参阅,其中提供了所需的结果:
orderid type year change
1111 2 2018 4652
1111 1 2019 3645
如果字段必须保持为VARCHAR
,则需要将JOIN
条件更改为
CAST(t1.change AS UNSIGNED) < CAST(t2.change AS UNSIGNED)
输出:
orderid total_change
1111 8297
当您尝试比较值时,您的问题是
VARCHAR
类型
因此,在比较时需要CAST
值或
选择t1*
来自表1 t1
左连接表1 t2
在t1.orderid=t2.orderid上
t1.year=t2.year
和转换(t1.更改为无符号)
当您尝试比较值时,您的问题是VARCHAR
类型
因此,在比较时需要CAST
值或
选择t1*
来自表1 t1
左连接表1 t2
在t1.orderid=t2.orderid上
t1.year=t2.year
和转换(t1.更改为无符号)
非常感谢您的投入!你之前的答案是第一位的,所以我必须给它打勾。非常感谢你的输入!你之前的答案是第一位的,所以我必须给它打勾。
orderid total_change
1111 8297
ALTER TABLE table1 MODIFY COLUMN `change` INT;
SELECT t1.*
FROM table1 t1
LEFT JOIN table1 t2
ON t1.orderid = t2.orderid
AND t1.year = t2.year
AND CAST(t1.change AS UNSIGNED) < CAST(t2.change AS UNSIGNED)
WHERE t2.change IS NULL
AND t1.orderid = '1111';
SELECT t1.*
FROM table2 t1
LEFT JOIN table2 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'