如何基于比较规则关联表并按重量计算商品价格
按重量区间匹配商品价格的解决方案
没问题,我帮你搞定这个按重量关联价格的问题~核心思路是为每个商品找到「小于等于其重量的最大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,会得到以下正确结果:
| id | item | weight | price |
|---|---|---|---|
| 1 | Coffee | 2 | 200 |
| 2 | Apple | 7 | 500 |
| 3 | Computer | 17 | 1000 |
额外提示
如果存在商品重量超过所有min_weight的情况(比如重量25),上述查询会返回NULL。你可以用COALESCE函数设置默认价格,或者在价格表中添加一个足够大的min_weight(比如9999)来覆盖所有极端情况。
内容的提问来源于stack exchange,提问作者Angga Ari Wijaya
相关产品推荐
相关产品推荐

