You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle按AIRCRAFTREG列查询最早航班并标记的SQL问题

嘿,我来帮你搞定这个Oracle查询的需求!你想要按AIRCRAFTREG(飞机注册号)分组,找出每个注册号对应的最早计划起飞时间,同时给这条最早的航班标记FIRST_FLIGHT = 1,其他航班标记0对吧?

先说说你原来代码里的几个小问题:

  1. 分组聚合(GROUP BY)会把每个注册号的所有航班合并成一行,如果你想保留所有航班记录并标记,这种方式就不适用了;
  2. CASE里的时间格式不统一(一个是DD-MM-YY,一个是DD-MM-YYYY),哪怕是同一个时间,字符串比对也会不匹配;
  3. 用MIN(...) IN (...)的逻辑不对,分组后没法和当前行的原始时间做有效比较。

推荐解决方案:用窗口函数实现(保留所有航班记录)

这种方式能保留每条航班的数据,同时精准标记出每个注册号下的最早航班:

SELECT
    TO_CHAR(SCHEDULED_DEPDT_LC, 'DD-MM-YY HH24:MI') AS SCHED_DEP,
    AIRCRAFTREG,
    CASE 
        WHEN ROW_NUMBER() OVER (PARTITION BY AIRCRAFTREG ORDER BY SCHEDULED_DEPDT_LC) = 1 
        THEN 1 
        ELSE 0 
    END AS FIRST_FLIGHT,
    -- 可选:显示该注册号的最早起飞时间(原始日期格式)
    MIN(SCHEDULED_DEPDT_LC) OVER (PARTITION BY AIRCRAFTREG) AS EARLIEST_SCHED_DEP
FROM DBODSXML4OPS.XML4OPS
WHERE STATUS IN ('Scheduled', 'Completed') -- 补全你需要的状态值
ORDER BY AIRCRAFTREG, SCHEDULED_DEPDT_LC;

代码解释:

  • ROW_NUMBER() OVER (PARTITION BY AIRCRAFTREG ORDER BY SCHEDULED_DEPDT_LC):按飞机注册号分组,每组内的航班按计划起飞时间升序排序,给每条记录分配一个行号,最早的航班行号为1;
  • CASE语句通过判断行号是否为1,来标记FIRST_FLIGHT的值;
  • 如果你需要直观看到每个注册号的最早起飞时间,加上MIN(...) OVER (...)窗口函数就能直接获取,不用额外分组。

如果你只需要每个注册号的最早航班一行记录

如果你的需求是每个注册号只展示最早的那条航班,那可以用分组聚合的方式,直接标记为1即可:

SELECT
    MIN(TO_CHAR(SCHEDULED_DEPDT_LC, 'DD-MM-YY HH24:MI')) AS SCHED_DEP,
    AIRCRAFTREG,
    1 AS FIRST_FLIGHT
FROM DBODSXML4OPS.XML4OPS
WHERE STATUS IN ('Scheduled', 'Completed')
GROUP BY AIRCRAFTREG;

内容的提问来源于stack exchange,提问作者aan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:45:31