You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

机场数据库SQL查询问题:获取飞行次数最多的飞行员ID时报错

解决"查询未将表达式'PilotID'作为聚合函数一部分"的问题

问题原因

你遇到的报错是SQL的核心规则在搞鬼:当SELECT语句中包含聚合函数(比如MAX())时,所有非聚合的列(这里是t.PilotID)必须要么被包含在GROUP BY子句中,要么被另一个聚合函数包裹。你的外层查询没有GROUP BY,数据库无法确定要返回哪个PilotID和最大飞行次数对应——毕竟可能有多个飞行员的飞行次数并列第一,所以直接把t.PilotID和MAX(t.flights)放在一起会触发语法错误。

几种可行的解决方案

方案1:排序后取第一条(适合只需要一个结果的场景)

如果你的数据库支持LIMIT(比如MySQL、PostgreSQL),可以先按飞行次数倒序排序,再取第一条:

SELECT PilotID, COUNT(*) AS flights
FROM Flights
GROUP BY PilotID
ORDER BY flights DESC
LIMIT 1;

⚠️ 注意:如果有多个飞行员飞行次数相同且都是最大值,这个方法只会返回其中一个,无法获取所有并列第一的记录。

方案2:匹配最大飞行次数(返回所有并列第一的飞行员)

通过子查询先算出最大飞行次数,再筛选出飞行次数等于这个最大值的飞行员:

SELECT PilotID, COUNT(*) AS flights
FROM Flights
GROUP BY PilotID
HAVING COUNT(*) = (
    SELECT MAX(flight_count)
    FROM (
        SELECT COUNT(*) AS flight_count
        FROM Flights
        GROUP BY PilotID
    ) AS sub_query
);

这个方法能返回所有飞行次数达到最大值的飞行员,兼容性也更好,几乎所有SQL数据库都支持。

方案3:使用窗口函数(更灵活的现代SQL写法)

如果你的数据库支持窗口函数(比如SQL Server、MySQL 8.0+、PostgreSQL),可以用RANK()或ROW_NUMBER()来实现:

WITH PilotFlightStats AS (
    SELECT 
        PilotID, 
        COUNT(*) AS flights,
        -- RANK()会给并列第一的记录相同的排名
        RANK() OVER (ORDER BY COUNT(*) DESC) AS flight_rank
    FROM Flights
    GROUP BY PilotID
)
SELECT PilotID, flights
FROM PilotFlightStats
WHERE flight_rank = 1;

如果用ROW_NUMBER()代替RANK(),会给每个记录分配唯一的排名,此时只会返回一个结果(并列时随机选一个,取决于数据库的排序规则)。

内容的提问来源于stack exchange,提问作者stav bitanski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:57:49