Oracle SQL-带分组和Having子句的嵌套查询

Oracle SQL-带分组和Having子句的嵌套查询,sql,database,oracle,Sql,Database,Oracle,所以问题来了 查找为某一目的地飞行距离大于该目的地所有航班平均距离的飞机的ID 这是模式 目的地(did:整数、dname:字符串、state:字符串) 飞机(辅助:整数,aname:string,颜色:string) 航班(辅助:整数,did:整数,fdate:日期,距离:真实) 到目前为止,我已经能够找到这个问题的两个不同部分的答案 我找到了飞往每个目的地的平均距离。 我还找到了每架飞机飞往每个地点的总距离 以下列出了对上述内容的查询: SELECT D.DID, AVG(F.DIST) a

所以问题来了

查找为某一目的地飞行距离大于该目的地所有航班平均距离的飞机的ID

这是模式

目的地(did:整数、dname:字符串、state:字符串)

飞机(辅助:整数,aname:string,颜色:string)

航班(辅助:整数,did:整数,fdate:日期,距离:真实)

到目前为止,我已经能够找到这个问题的两个不同部分的答案

我找到了飞往每个目的地的平均距离。 我还找到了每架飞机飞往每个地点的总距离

以下列出了对上述内容的查询:

SELECT D.DID, AVG(F.DIST) as AvgDist from Destinations D join Flights F ON F.DID = D.DID GROUP BY D.DID;

SELECT F.AID,F.DID, SUM(F.DIST) as fDist from Flights F join Destinations D ON F.DID = D.DID GROUP BY F.AID,F.DID;

我的问题是,我不知道如何结合它们来找到解决方案。我知道我需要做的就是找出一种方法来检查该目的地的平均距离是否小于该架飞机的飞行距离,但我不知道如何继续。我所有的Having子句似乎都不起作用,所以我现在有点卡住了。

使用分析函数并不困难:

SELECT DISTINCT AID FROM (
    SELECT F.AID, D.DID, 
           AVG(F.DIST) OVER (PARTITION BY D.DID) as AvgDist, 
           SUM(F.DIST) OVER (PARTITION BY F.AID, D.DID) as AirDistance
    FROM Destinations D join Flights F ON F.DID = D.DID
) WHERE AirDistance > AvgDist;
对于子查询,应该是这样的:

SELECT DISTINCT a.AID 
FROM
    (SELECT D.DID, AVG(F.DIST) as AvgDist 
     FROM Destinations D join Flights F 
         ON F.DID = D.DID GROUP BY D.DID
    ) d  
    JOIN     
    (SELECT F.AID,F.DID, SUM(F.DIST) as fDist 
     FROM Flights F join Destinations D 
          ON F.DID = D.DID GROUP BY F.AID,F.DID
    ) a
    ON d.DID = a.DID 
WHERE fDist > AvgDist;    

我从来没有听说过分区,我必须查一下。有没有其他方法可以不用分区表来实现这一点?或者这是最常见的查询方式吗?@sealsix使用分析函数时,操作更少谢谢,当你把它写出来时,它是有意义的,但由于某种原因,我无法理解它。我需要在from语句中使用临时表。