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

如何用SQL提取唯一站点对最值及单站点到其他站点票价极值?

解决站点交通票价的两个SQL需求

嗨,我来帮你搞定这两个关于站点交通票价的SQL需求!先假设咱们的表名叫route_prices,核心字段包括departure_station(出发站)、arrival_station(到达站)、price(票价)——如果你的表结构不一样,把字段名换成你实际用的就行。

需求1:提取每个唯一站点对的最小、最大票价

这里要先明确:站点对是否区分方向?比如「北京→上海」和「上海→北京」算两个不同的站点对,还是同一个?我分两种情况给你写SQL:

情况1:站点对区分方向(A→B 和 B→A 是不同的)

这种情况直接按出发站和到达站分组,用聚合函数MIN()和MAX()取票价的最值:

SELECT
  departure_station,
  arrival_station,
  MIN(price) AS min_price,
  MAX(price) AS max_price
FROM route_prices
GROUP BY departure_station, arrival_station
ORDER BY departure_station, arrival_station;

情况2:站点对不区分方向(A→B 和 B→A 算同一个)

这里需要用LEAST()和GREATEST()函数把站点对统一成“小站在前,大站在后”的格式,确保同一组的站点对被归为一类:

SELECT
  LEAST(departure_station, arrival_station) AS station_a,
  GREATEST(departure_station, arrival_station) AS station_b,
  MIN(price) AS min_price,
  MAX(price) AS max_price
FROM route_prices
GROUP BY station_a, station_b
ORDER BY station_a, station_b;

备注:如果你的数据库不支持LEAST()和GREATEST()(比如SQL Server),可以用CASE语句替代上面的字段,示例如下:

CASE WHEN departure_station < arrival_station THEN departure_station ELSE arrival_station END AS station_a,
CASE WHEN departure_station < arrival_station THEN arrival_station ELSE departure_station END AS station_b

需求2:两个子需求的实现

你提到的第二个需求包含两个小目标:一是查询从指定站点到其他所有站点的最高、最低票价;二是获取所有唯一站点对的最低票价。我分开给你写对应的SQL:

子需求2.1:从指定站点到其他所有站点的最高、最低票价

假设你要查询的出发站是「北京」,把下面的'北京'换成你实际要查的站点名即可:

SELECT
  arrival_station,
  MIN(price) AS min_price,
  MAX(price) AS max_price
FROM route_prices
WHERE departure_station = '北京'
GROUP BY arrival_station
ORDER BY arrival_station;

如果需要区分交通方式,可以把transport_type也加入SELECT和GROUP BY里,这样能看到每种交通方式的票价最值。

子需求2.2:获取所有唯一站点对的最低票价

同样分两种场景:

区分方向的版本

SELECT
  departure_station,
  arrival_station,
  MIN(price) AS min_price
FROM route_prices
GROUP BY departure_station, arrival_station
ORDER BY departure_station, arrival_station;

不区分方向的版本

SELECT
  LEAST(departure_station, arrival_station) AS station_a,
  GREATEST(departure_station, arrival_station) AS station_b,
  MIN(price) AS min_price
FROM route_prices
GROUP BY station_a, station_b
ORDER BY station_a, station_b;

如果想把这两个子需求的结果合并展示(比如先显示指定站点的票价,再显示所有站点对的最低票价),可以用UNION ALL,注意要保证两个查询的字段数和类型一致:

-- 先显示指定站点到其他站点的票价最值
SELECT
  departure_station,
  arrival_station,
  MIN(price) AS min_price,
  MAX(price) AS max_price
FROM route_prices
WHERE departure_station = '北京'
GROUP BY departure_station, arrival_station

UNION ALL

-- 再显示所有站点对的最低票价(max_price填NULL保证字段一致)
SELECT
  LEAST(departure_station, arrival_station) AS station_a,
  GREATEST(departure_station, arrival_station) AS station_b,
  MIN(price) AS min_price,
  NULL AS max_price
FROM route_prices
GROUP BY station_a, station_b;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:16:53