Oracle按AIRCRAFTREG列查询最早航班并标记的SQL问题
嘿,我来帮你搞定这个Oracle查询的需求!你想要按AIRCRAFTREG(飞机注册号)分组,找出每个注册号对应的最早计划起飞时间,同时给这条最早的航班标记FIRST_FLIGHT = 1,其他航班标记0对吧?
先说说你原来代码里的几个小问题:
- 分组聚合(
GROUP BY)会把每个注册号的所有航班合并成一行,如果你想保留所有航班记录并标记,这种方式就不适用了; CASE里的时间格式不统一(一个是DD-MM-YY,一个是DD-MM-YYYY),哪怕是同一个时间,字符串比对也会不匹配;- 用
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
相关产品推荐
相关产品推荐

