为每种型号的飞机生成飞行时间最多的飞行员列表。包括pid,模型和已记录小时数的列。
这是我尝试过的-我对SQL还是很陌生:
select
pid, hourslogged
from
flightskills f
join
(select
model, max(hourslogged) as Hourslogged
from
flightskills
group by
model) h on f.model = h.model
此输出错误
PID MODEL HOURSLOGGED
1 A-10 387
4 A-10 387
6 A-10 387
7 A-10 387
3 F-117A 254
4 F-117A 254
5 F-117A 254
6 F-117A 254
1 F-15E 450
2 F-15E 450
3 F-15E 450
4 F-15E 450
6 F-15E 450
1 F-16 827
6 F-16 827
1 F-22 900
3 F-22 900
4 F-22 900
5 F-22 900
6 F-22 900
6 X-100 100
想要这样的东西
PID MODEL HOURSLOGGED
1 A-10 387
3 F-117A 254
4 F-15E 450
1 F-16 827
3 F-22 900
6 X-100 100
答案 0 :(得分:1)
我认为您正在寻找这样的东西:
select f.*
from flightskills f
where f.hourslogged = (select max(f2.hourslogged)
from flightskills f2
where f2.model = f.model
);
答案 1 :(得分:1)
在您的查询中
select pid, hourslogged
from flightskills f
join
(select model, max( hourslogged) as Hourslogged
from flightskills
group by model) h
on f.model = h.model
编译查询时,有两个PID
列和两个HOURSLOGGED
列,f.PID
和h.PID
以及f.HOURSLOGGED
和{{1 }}。在SELECT列表中,您需要告诉数据库要使用哪几列。要解决该问题,您可以将查询更改为
h.HOURSLOGGED
祝您在接下来的工作中一切顺利。
答案 2 :(得分:0)
您甚至不需要进行嵌套查询。使用Oracle时,可以利用Analytic Functions。仍然需要一点子查询,因为分析功能不会直接在WHERE条件下运行(它在评估条件的地方之后运行)。
SELECT
pid,
model,
hourslogged,
FROM (
SELECT
pid,
model,
hourslogged,
ROW_NUMBER() OVER (PARTITION BY model ORDER BY hourslogged DESC) AS rn
FROM flightskills
) WHERE rn = 1
您可以使用其他排名方法,而不是简单的ROW_NUMBER
。例如,DENSE_RANK
将以两名飞行员以不同的时间记录相同的小时数来处理这种情况(他们将同时出现而不是随机显示两个小时)。
对于每种模型,以上方法直接排在hourslogged
的最高记录之后。您可以分两个步骤进行操作:1. /排名2. /选择排名最高的(rn = 1
)。