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

如何用SQL筛选航班数据中的唯一与非唯一往返组合?

航班往返组合筛选SQL解决方案

现有航班数据

dep, arr
uk, usa
usa, uk
china,aus
aus,china
brazil,uk

筛选需求

  • 唯一组合:出发地与目的地的往返记录均存在的航线,结果示例:
dep, arr
uk, usa
usa, uk
china,aus
aus,china
  • 非唯一组合:仅存在单向记录的航线,结果示例:
brazil,uk

现有查询代码

已尝试以下窗口函数查询,但不确定如何精准筛选非唯一组合:

Select          
           dep, arr,  count(*) over (partition by least(dep, arr), greatest(dep, arr) order by dep) rnk
From flights

解决方案

你的思路方向是对的——用least()和greatest()把往返航线归为同一分组,接下来可基于分组计数直接筛选两类数据:

1. 筛选唯一组合(往返均存在)

先计算每个航线组的总记录数,筛选出总记录数为2的组即可:

SELECT dep, arr
FROM (
    SELECT 
        dep, arr,
        COUNT(*) OVER (PARTITION BY LEAST(dep, arr), GREATEST(dep, arr)) AS group_count
    FROM flights
) t
WHERE group_count = 2;

2. 筛选非唯一组合(仅单向存在)

同理,筛选总记录数为1的组:

SELECT dep, arr
FROM (
    SELECT 
        dep, arr,
        COUNT(*) OVER (PARTITION BY LEAST(dep, arr), GREATEST(dep, arr)) AS group_count
    FROM flights
) t
WHERE group_count = 1;

替代写法(GROUP BY子查询关联)

如果偏好不用窗口函数,也可以先分组统计航线组数量,再关联原表筛选:

-- 唯一组合
SELECT f.dep, f.arr
FROM flights f
JOIN (
    SELECT LEAST(dep, arr) AS a, GREATEST(dep, arr) AS b
    FROM flights
    GROUP BY a, b
    HAVING COUNT(*) = 2
) g ON (f.dep = g.a AND f.arr = g.b) OR (f.dep = g.b AND f.arr = g.a);

-- 非唯一组合
SELECT f.dep, f.arr
FROM flights f
JOIN (
    SELECT LEAST(dep, arr) AS a, GREATEST(dep, arr) AS b
    FROM flights
    GROUP BY a, b
    HAVING COUNT(*) = 1
) g ON (f.dep = g.a AND f.arr = g.b) OR (f.dep = g.b AND f.arr = g.a);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:05:11