繁体   English   中英

聚合时的MySQL语法查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM