Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL获取多个列上连接的每个组的最大值_Mysql_Max_Left Join_Grouping - Fatal编程技术网

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'