Oracle中实现Avg Delay表显示Schedule表无延误站点的0值
解决Avg Delay Departure表中缺失Schedule表站点并显示0值的问题
看起来你需要让Avg Delay Departure表包含Schedule表中所有站点,哪怕该站点没有延误记录(比如BMU),并将这些站点的平均延误设为0。这里有个可行的解决方案:
首先,原查询的问题在于它只返回了满足延误时间超过15分钟且有实际起飞记录的站点,而Schedule表中的BMU因为没有符合条件的延误数据,所以没有出现在结果集中。要实现需求,我们需要将Schedule表作为主表,通过左连接关联原查询的结果,再用NVL函数将缺失的平均延误值替换为0。
修改后的查询语句
SELECT s.STATION, NVL(d.DEPAVERAGE, 0) AS "Avg Delay Departure" FROM Schedule s LEFT JOIN ( -- 原查询作为子查询,保留原有延误数据计算逻辑 SELECT DEPAIRPORT AS STATION, TO_NUMBER(TO_CHAR(TRUNC(SYSDATE) + AVG(CAST(ACTUAL_BLOCKOFF_LC AS DATE) - CAST(SCHEDULED_DEPDT_LC AS DATE)), 'sssss'))/60 AS DEPAVERAGE FROM DBODSXML4OPS.XML4OPS WHERE ACTUAL_BLOCKOFF_LC IS NOT NULL AND SERVICETYPE IN ('J','G') AND (ACTUAL_BLOCKOFF_LC - SCHEDULED_DEPDT_LC)*24*60 > '+000000015 00:00:00.000000000' AND STATUS IN ('Scheduled') AND TO_CHAR(SCHEDULED_DEPDT_LC, 'yyyy-mm-dd') BETWEEN '2018-04-14' AND '2018-05-14' GROUP BY DEPAIRPORT ) d ON s.STATION = d.STATION ORDER BY s.STATION ASC;
关键逻辑说明
- 左连接(LEFT JOIN):确保Schedule表中的所有站点都会被保留,即使子查询中没有对应的数据(比如BMU)。
- NVL函数:当子查询返回的
DEPAVERAGE为NULL时,自动替换为0,完美满足无延误站点显示0值的需求。 - 子查询完整保留了原有的业务筛选逻辑,不会影响已有站点的平均延误计算结果。
预期结果
执行该查询后,Avg Delay Departure表会包含Schedule表中全部11个站点,其中BMU的"Avg Delay Departure"字段值为0,其余站点的数值与原查询结果完全一致。
内容的提问来源于stack exchange,提问作者aan
相关产品推荐
相关产品推荐

