如何用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
相关产品推荐
相关产品推荐

