SQL技术问题:如何仅对MIN(rate)行的adults字段减2?
解决方案:针对最小rate行调整adults字段
要实现仅对MIN(rate)对应的行的adults字段减2,其余行保持不变,你可以通过窗口函数获取全局最小rate,再结合CASE条件判断来调整adults的计算值。下面是修改后的查询语句:
SELECT rate, SUM(nights) AS nights, rate * SUM(nights) AS subtotal, -- 由于GROUP BY rate,SUM(rate)等价于当前组的rate值 (rate * SUM(nights)) * MIN(tax) AS tax, CASE WHEN rate = MIN(rate) OVER() THEN SUM(adults) - 2 ELSE SUM(adults) END AS adults, SUM(fee) AS fee, ((rate * SUM(nights)) * MIN(tax)) + SUM(fee) AS total FROM table WHERE `group` = @group_code -- 注意group是SQL保留关键字,需用反引号包裹避免语法错误 GROUP BY rate
关键思路说明:
- 窗口函数
MIN(rate) OVER():这个函数会在整个分组后的结果集中计算最小的rate值,让每一行都能获取到全局最小rate,无需额外子查询关联。 - CASE条件判断:检查当前行的
rate是否等于全局最小rate,如果是,就对SUM(adults)减去2;否则保持原求和值不变。 - 优化小细节:原查询中
SUM(rate)因为已经按rate分组,所以等价于当前组的rate值,直接用rate代替更简洁。
验证示例结果:
针对你提供的示例数据,修改后的查询会输出:
| rate | nights | subtotal | tax | adults | fee | total |
|---|---|---|---|---|---|---|
| 0.00 | 14 | 0.00 | 0.00 | 19 | 105 | 105.00 |
| 154.00 | 226 | 34804.00 | 5373.04 | 141 | 705 | 40882.04 |
| 254.00 | 6 | 1524.00 | 235.27 | 4 | 20 | 1779.27 |
可以看到,rate=0.00(全局最小rate)的行的adults从21变成了19,其余行的adults值保持不变。
内容的提问来源于stack exchange,提问作者Femmer
相关产品推荐
相关产品推荐

