为什么包含聚合的SQL不能选择访问其他列?

为什么包含聚合的SQL不能选择访问其他列?,sql,select,aggregates,Sql,Select,Aggregates,我有一个关于商业航空公司航班的信息表,其中包括给定航班的始发城市、始发城市和实际航班时间 我试图理解为什么一个简单的查询不能返回最长飞行时间的航班的始发城市 以下查询: SELECT FLIGHTS.origin_city, MAX( FLIGHTS.actual_time ) as [time] FROM FLIGHTS 导致错误的原因: Column 'FLIGHTS.origin_city' is invalid in the select list because it is not

我有一个关于商业航空公司航班的信息表,其中包括给定航班的始发城市、始发城市和实际航班时间

我试图理解为什么一个简单的查询不能返回最长飞行时间的航班的始发城市

以下查询:

SELECT FLIGHTS.origin_city, MAX( FLIGHTS.actual_time ) as [time]
FROM FLIGHTS
导致错误的原因:

Column 'FLIGHTS.origin_city' is invalid in the select list because
it is not contained in either an aggregate function or the GROUP BY
clause.
我认为SQL解释此查询的方式是,它将找到具有最长飞行时间的行,然后显示该行的“起始城市”和“实际时间”列

为什么不起作用

如果我不选择原始城市,则查询运行正常:

SELECT MAX( FLIGHTS.actual_time ) as [time]
FROM FLIGHTS
如果我按照始发城市对航班进行分组,那么SQL从每一行提取始发城市和实际时间都不会有任何问题

SELECT FLIGHTS.origin_city, MAX( FLIGHTS.actual_time ) as [time]
FROM FLIGHTS
GROUP BY FLIGHTS.origin_city

请注意,我不是在寻找一个有效的查询;我试图理解为什么我在文章开头的天真质询不起作用…:-这似乎有一个简单的答案。。。然而为什么你的第一个查询不能给出你想要的答案,一个简单的答案是你从未告诉它在FLIGHTS.origin\u city上分组,因此它不知道该如何处理该字段。您添加了一个聚合函数MAX,但还添加了另一个字段。。。因此,现在不仅要查看FLIGHTS.actual_time,还要查看FLIGHTS.origin_city,因此,当我们对FLIGHTS.origin_city进行分组时,查询知道您要查看每个origin_city的最大实际_时间

查询不知道哪个城市需要MAXFLIGHTS.actual\u时间。如果您想知道某个特定的原点城市及其最大实际时间,可以在WHERE子句中添加一个过滤器,以指定要查看的原点城市。。。否则,通过将origin\u city添加到GROUP by子句,现在可以告诉查询您希望看到每个城市的最大实际\u时间


如果未将其添加到GROUPBY子句中,SQL将不知道如何使用MAX。

这似乎有一个简单的答案。。。然而为什么你的第一个查询不能给出你想要的答案,一个简单的答案是你从未告诉它在FLIGHTS.origin\u city上分组,因此它不知道该如何处理该字段。您添加了一个聚合函数MAX,但还添加了另一个字段。。。因此,现在不仅要查看FLIGHTS.actual_time,还要查看FLIGHTS.origin_city,因此,当我们对FLIGHTS.origin_city进行分组时,查询知道您要查看每个origin_city的最大实际_时间

SELECT FLIGHTS.origin_city, MAX( FLIGHTS.actual_time ) as [time]
FROM FLIGHTS
查询不知道哪个城市需要MAXFLIGHTS.actual\u时间。如果您想知道某个特定的原点城市及其最大实际时间,可以在WHERE子句中添加一个过滤器,以指定要查看的原点城市。。。否则,通过将origin\u city添加到GROUP by子句,现在可以告诉查询您希望看到每个城市的最大实际\u时间

如果未将其添加到GROUPBY子句中,则SQL不知道如何使用MAX

SELECT FLIGHTS.origin_city, MAX( FLIGHTS.actual_time ) as [time]
FROM FLIGHTS
我认为SQL解释此查询的方式是,它将找到具有最长飞行时间的行,然后显示该行的“起始城市”和“实际时间”列

我觉得那种解释很愚蠢。您建议SQL如何处理这些查询

SELECT FLIGHTS.origin_city, MAX(FLIGHTS.actual_time) as [time],
       MIN(FLIGHTS.actual_time)
FROM FLIGHTS;
或:

没那么明显吧?我想,如果有一个聚合函数,它是MIN或MAX,而不是其他任何函数,您可以进行一些特殊情况的解释。事实上,SQLite做到了这一点——这对通过该数据库学习聚合的人是有害的

此外,还有一个真正简单的方法来做你想做的事情:

SELECT FLIGHTS.origin_city, FLIGHTS.actual_time
FROM FLIGHTS
ORDER BY FLIGHTS.actual_time DESC
OFFSET 0 ROW FETCH FIRST 1 ROW ONLY;
我认为SQL解释此查询的方式是,它将找到具有最长飞行时间的行,然后显示该行的“起始城市”和“实际时间”列

我觉得那种解释很愚蠢。您建议SQL如何处理这些查询

SELECT FLIGHTS.origin_city, MAX(FLIGHTS.actual_time) as [time],
       MIN(FLIGHTS.actual_time)
FROM FLIGHTS;
或:

没那么明显吧?我想,如果有一个聚合函数,它是MIN或MAX,而不是其他任何函数,您可以进行一些特殊情况的解释。事实上,SQLite做到了这一点——这对通过该数据库学习聚合的人是有害的

此外,还有一个真正简单的方法来做你想做的事情:

SELECT FLIGHTS.origin_city, FLIGHTS.actual_time
FROM FLIGHTS
ORDER BY FLIGHTS.actual_time DESC
OFFSET 0 ROW FETCH FIRST 1 ROW ONLY;

看起来您的问题与此相同,请查看是否有帮助如果查询有GROUP BY子句,则此子句中未包含的所有列应显示为SUM、MIN、MAX、,AVG等。该规则的例外情况是,其他列直接依赖于GROUP BY子句中包含的键。看起来您的问题与此相同,请查看是否有帮助。如果查询有GROUP BY子句,则此子句中未包含的所有列应显示为SUM、MIN、MAX中的聚合列,AVG等。规则的例外是,其他列直接依赖于GROUP BY子句中包含的键。我认为您指的是顺序
按航班。实际时间DESC@JonathanWillcock . . . 谢谢。我想你指的是航班订购。实际时间DESC@JonathanWillcock . . . 非常感谢。