MySQL获得在多列上加入的每个组的最大值

问题描述 投票:0回答:2

我找到了许多其他类似查询的答案,但没有一个符合我的要求,因此问题。

一,数据:

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

mysql max left-join grouping
2个回答
1
投票

您的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

Demo on SQLFiddle


1
投票

当您尝试比较值时,您的问题是qazxsw poi类型。

因此,比较时需要VARCHAR值或CAST

change your schema

ALTER TABLE table1 MODIFY COLUMN `change` INT;

http://sqlfiddle.com/#!9/b2786a/6
© www.soinside.com 2019 - 2024. All rights reserved.