mysql - 如何获取最大平均值及其按月分组的 Id

标签 mysql sql

我想要最大平均值及其按月分组的 id,

Select FK_Transporter,Month, MAX(avg_rate) as BTPercent
FROM (
    SELECT kpi.FK_Transporter ,kpi.`Month`, AVG(kpi.OnTimeDelivery) as avg_rate
    FROM primarykpi as kpi,transporter as t
        WHERE kpi.FK_Transporter=t.Id and YEAR(kpi.`Month`)=2016
    GROUP BY FK_Transporter, MONTH(kpi.Month)) tp
GROUP BY tp.`Month`

这个查询给了我正确的平均值,但 id 不正确。找不到错误。这是此查询的输出

FK_Transporter       Month             MaxAvg
1                    2016-01-01        2.270109534263611
1                    2016-02-01        0.8539329767227173
1                    2016-03-01        0.6764709949493408

FK_transporter 在所有错误的记录中都是 1。我怎样才能解决这个问题。谢谢。

这是一个 fiddle 链接 http://sqlfiddle.com/#!9/02d7c/1/0

最佳答案

问题是你在外部查询中只按月分组,所以 mysql 几乎选择它在扫描内部子查询的结果时遇到的第一个 fk_transporter 值。在外部查询中,您需要获取每月的最大平均值并将其加入内部子查询以获取结果:

SELECT t2.fk_transporter, t.month, t.btpercent
FROM
(Select `Month`, MAX(avg_rate) as BTPercent
FROM (
    SELECT kpi.FK_Transporter ,kpi.`Month`, AVG(kpi.OnTimeDelivery) as avg_rate
    FROM primarykpi as kpi,transporter as t
        WHERE kpi.FK_Transporter=t.Id and YEAR(kpi.`Month`)=2016
    GROUP BY FK_Transporter, MONTH(kpi.Month)) tp
GROUP BY tp.`Month`) t
INNER JOIN 
(
    SELECT kpi.FK_Transporter ,kpi.`Month`, AVG(kpi.OnTimeDelivery) as avg_rate
    FROM primarykpi as kpi,transporter as t
        WHERE kpi.FK_Transporter=t.Id and YEAR(kpi.`Month`)=2016
    GROUP BY FK_Transporter, MONTH(kpi.Month)) t2
ON t2.Month=t.month and t2.avg_rate=t.btpercent

Sqlfiddle

关于mysql - 如何获取最大平均值及其按月分组的 Id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34982160/

相关文章:

php - Mysql 连接两个表的数量之和

PHP插入错误没有解释

带有 mysql 数据库信息的 PHP/Html 表单

mysql - 当在其他链接表上更新特定列时从一个表中删除行 - SQL 触发器

php - MySql如何通过过滤多列来限制多个数字?

Sql:使用特殊字符作为表列的别名?

Java JDBC 与 mySql - 从表传递 id

mysql - 在逻辑 ER 设计中,什么时候外键也应该是主键?

sql - 是否可以将变量传递给 SQL/DDL 脚本?

SQL COUNT 个,共 COUNT 个