我有一个关于城市看起来像这样之间的航班信息的表:
origin_city dest_city time
Dothan AL Atlanta GA 171
Dothan AL Elsewhere AL 2
Boston MA New York NY 5
Boston MA City MA 5
New York NY Boston MA 5
New York NY Poughkipsie NY 2
我想返回,每个起点城市,最大飞行时间和目的地城市或与之相伴的城市。所以,结果是这样的:
Dothan AL Atlanta GA 171
Boston MA New York NY 5
Boston MA City MA 5
New York NY Boston MA 5
基于其他线程,就像Reason for Column is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause,我写了一个返回从每个起点城市最大飞行时间查询:
SELECT DISTINCT F.origin_city AS origin_city, Max(F.actual_time) AS actual_time
FROM Flights AS F
GROUP BY F.origin_city
ORDER BY F.origin_city
但我得到的各种错误,当我尝试包括匹配时间目标(S)。例如:
SELECT DISTINCT F.origin_city AS origin_city, Max(F.actual_time) AS actual_time, F.dest_city AS dest_city
FROM Flights AS F
GROUP BY F.origin_city
HAVING
(MAX(F.actual_time) = F.actual_time)
ORDER BY F.origin_city
GO
......给我的错误“列Flights.actual_time',因为它不是在聚合函数或GROUP BY子句是包含在HAVING子句中无效。”我尝试添加F.actual_time到组通过,但后来我得到吨的结果,因为我得到的最大飞行时间为每个起点/终点对(我认为)。此外,actual_time场应包含在聚合函数:最大。
此代码:
SELECT F.origin_city AS origin_city, Max(F.actual_time) AS actual_time, F.dest_city AS dest_city
FROM Flights as F
WHERE F.actual_time IN (SELECT MAX(actual_time) FROM Flights AS F2 GROUP BY F2.origin_city)
GROUP BY F.origin_city
给出了一个类似的错误:因为它不是在聚合函数或GROUP BY子句中包含列“Flights.dest_city”在选择列表中无效。
我怎样才能正确地返回所有3列?
你想RANK()
:
SELECT F.*
FROM (SELECT F.*,
RANK() OVER (PARTITION BY origin_city ORDER BY time DESC) AS SEQ
FROM Flights AS F
) F
WHERE SEQ = 1;
如果我和你的版本去的话,我会做:
SELECT F.*
FROM Flights as F
WHERE F.actual_time = (SELECT MAX(F2.actual_time)
FROM Flights AS F2
WHERE F2.origin_city = F.origin_city
);
您GROUP BY
是两个outer
&subquery
实际上是不必要的,只是通过outer query
在F.origin_city
(subquery
)引用(F2.origin_city
),使其相关子查询。
你可以加入你已经表qazxsw POI匹配从Flights
的qazxsw POI列,qazxsw POI从查询到origin_city
查询:
actual_time