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

如何基于比较规则关联表并按重量计算商品价格

按重量区间匹配商品价格的解决方案

没问题,我帮你搞定这个按重量关联价格的问题~核心思路是为每个商品找到「小于等于其重量的最大min_weight」,这样就能精准匹配对应的价格区间,完全避免规则冲突。

逻辑原理

价格表的min_weight其实定义了价格区间的下限:

  • min_weight=0 → 覆盖0 ≤ weight <5的商品
  • min_weight=5 → 覆盖5 ≤ weight <10的商品
  • min_weight=10 → 覆盖10 ≤ weight <20的商品
  • min_weight=20 → 覆盖weight ≥20的商品

我们只需要为每个交易记录筛选出满足min_weight ≤ 商品weight的最大min_weight,就能拿到对应的正确价格。

具体SQL实现

下面提供几种不同数据库环境下的写法,你可以根据自己的数据库选择:

方法1:用窗口函数(支持MySQL 8+、PostgreSQL、SQL Server等)

这种写法逻辑清晰,扩展性强:

SELECT 
    t.id,
    t.item,
    t.weight,
    p.price
FROM (
    SELECT 
        t.*,
        p.min_weight,
        p.price,
        -- 按每个交易分组,把符合条件的min_weight倒序排序,取第一行
        ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY p.min_weight DESC) AS rn
    FROM Transactions t
    LEFT JOIN Prices p ON p.min_weight <= t.weight
) AS sub_query
WHERE rn = 1;

方法2:关联子查询(兼容所有数据库,包括旧版MySQL)

这种写法更简洁,适合简单场景:

SELECT 
    t.id,
    t.item,
    t.weight,
    -- 子查询直接找到符合条件的最大min_weight对应的价格
    (SELECT p.price 
     FROM Prices p 
     WHERE p.min_weight <= t.weight 
     ORDER BY p.min_weight DESC 
     LIMIT 1) AS price
FROM Transactions t;

验证结果

用你提供的测试数据运行上述SQL,会得到以下正确结果:

iditemweightprice
1Coffee2200
2Apple7500
3Computer171000

额外提示

如果存在商品重量超过所有min_weight的情况(比如重量25),上述查询会返回NULL。你可以用COALESCE函数设置默认价格,或者在价格表中添加一个足够大的min_weight(比如9999)来覆盖所有极端情况。

内容的提问来源于stack exchange,提问作者Angga Ari Wijaya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:34:00