[英]MySQL syntax query on aggregation
我有一个名为TICKET的表,其中包含FLIGHTNUMBER和INSURED列。 INSURED只有0或1个值。 FLIGHTNUMBER有重复项。 我想获取INSURED中最大数量为1的FLIGHTNUMBER。 这是我尝试过的:
SELECT FLIGHTNUMBER
FROM (SELECT FLIGHTNUMBER,SUM(INSURED) AS INSURANCE_COUNT
FROM TICKET
GROUP BY TICKET.FLIGHTNUMBER) AS OUT2
WHERE OUT2.INSURANCE_COUNT = MAX(INSURANCE_COUNT) ;
和
SELECT FLIGHTNUMBER
FROM (SELECT FLIGHTNUMBER,SUM(INSURED) AS INSURANCE_COUNT
FROM TICKET
GROUP BY TICKET.FLIGHTNUMBER
HAVING INSURANCE_COUNT = MAX(SUM(INSURED))) AS OUT2;
但是两者都导致错误。 您能告诉我正确的语法吗? 提前致谢。
第一个不起作用,因为您不能在WHERE
子句中使用聚合函数。 只有在选择了所有行之后才进行聚合,并且使用WHERE
来选择行,因此存在鸡与蛋的问题。
第二个不起作用,因为您不能嵌套聚合函数。
您不需要计算MAX(INSURANCE_COUNT)
。 只需订购查询并进行第一个查询。
SELECT flightnumber
FROM (SELECT flightnumber, SUM(INSURED) AS insurance_count
FROM ticket
GROUP BY flightnumber) AS out2
ORDER BY insurance_count DESC
LIMIT 1
您甚至在SELECT
列表中甚至不需要insurance_count
,因此您无需将其包装在子查询中即可摆脱它。
SELECT flightnumber
FROM ticket
GROUP BY flightnumber
ORDER BY SUM(insured) DESC
LIMIT 1
但是,如果有多个航班并列为最高限额,这只会返回其中之一。 如果需要全部获取,则需要编写一个获取最大值的子查询,并与之联接。
SELECT flightnumber
FROM (SELECT flightnumber, SUM(insured) AS insurance_count
FROM ticket
GROUP BY flightnumber) AS out2
JOIN (SELECT SUM(insured) AS max_insurance_count
FROM ticket
GROUP BY flightnumber
ORDER BY max_insurance_count DESC
LIMIT 1) AS out3
ON out2.insurance_count = out3.max_insurance_count
你可以做:
SELECT flightnumber, SUM(insured) AS insured_count
FROM ticket
GROUP BY flightnumber
ORDER BY insured_count DESC
LIMIT 1;
这只是insured
列上的SUM
聚合,按flightnumber
分组,并按降序在insured_count
上排序。 我们只保留第一个结果。
这没有考虑如果两个航班号具有相同的最大保险人数会发生什么。 您可以使用第二个ORDER BY
字段打破关系,或者运行另一个外部查询。
如果您有flightnumber
表,则每次修改ticket
表时都可以使用SUM()
更新其insured_count
字段。 如果您经常运行此报告, ticket
表以很多行结尾,并且大多数行在完成飞行后都没有更改,那会更有效率。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.