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

如何对terms表分组并按每组最低价格优先排序?

分组并按每组最低价格优先排序的SQL实现方案

看你的需求是要对terms表中的行程记录分组,然后让每组按最低价格优先排序对吧?首先得明确分组的核心维度:从你的数据结构和样本来看,应该是按**t_id(产品ID)、d_start(行程开始日期)、d_end(行程结束日期)、departure_from(出发地)**这几个字段来分组,因为这些字段相同的记录属于同一个行程产品。

下面是几种不同场景下的实现方案:

场景1:展示所有记录,同组内按价格从低到高排序

如果只是想把同一行程的记录集中在一起,并且每组内价格最低的排在最前面,直接用ORDER BY就能搞定,把分组字段放在排序的前面,最后加上价格升序:

SELECT id, t_id, d_start, d_end, price, departure_from
FROM terms
ORDER BY t_id, d_start, d_end, departure_from, price ASC;

这样相同行程的记录会被归为一组,组内自动按价格从低到高排列。

场景2:只提取每组中价格最低的记录

如果需要筛选出每个行程分组里价格最低的那条(或几条)记录,用窗口函数是最直观的方式:

SELECT id, t_id, d_start, d_end, price, departure_from
FROM (
    -- 给每个分组内的记录按价格升序编号,最低价的记录编号为1
    SELECT *,
           ROW_NUMBER() OVER (
               PARTITION BY t_id, d_start, d_end, departure_from 
               ORDER BY price ASC
           ) AS price_rank
    FROM terms
) ranked_terms
WHERE price_rank = 1;

注意:如果同一分组内有多个价格相同的最低价记录(比如你样本里t_id=10、5.5-5.15、london的分组里有两条90的记录),ROW_NUMBER()只会随机保留其中一条。如果想保留所有最低价的记录,可以把ROW_NUMBER()换成RANK()或者DENSE_RANK()。

场景3:整体按每组最低价排序,组内再按价格排序

如果需要先把所有记录按所在分组的最低价从低到高排列,同组内再按自身价格升序,可以先聚合出每组的最低价,再关联原表排序:

SELECT t.*, group_min_price
FROM terms t
INNER JOIN (
    -- 计算每个行程分组的最低价
    SELECT t_id, d_start, d_end, departure_from, MIN(price) AS group_min_price
    FROM terms
    GROUP BY t_id, d_start, d_end, departure_from
) group_prices 
    ON t.t_id = group_prices.t_id
    AND t.d_start = group_prices.d_start
    AND t.d_end = group_prices.d_end
    AND t.departure_from = group_prices.departure_from
ORDER BY group_prices.group_min_price ASC, t.price ASC;

这样所有记录会先按分组的最低价排序,同一分组内的记录再按自身价格从低到高排列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:44:15