在查询中查询

时间:2018-11-10 19:31:37

标签: sql oracle

为每种型号的飞机生成飞行时间最多的飞行员列表。包括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

3 个答案:

答案 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.PIDh.PID以及f.HOURSLOGGED和{{1 }}。在SELECT列表中,您需要告诉数据库要使用哪几列。要解决该问题,您可以将查询更改为

h.HOURSLOGGED

dbfiddle here

祝您在接下来的工作中一切顺利。

答案 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)。