SQL滚动Left列生成Final列的更新逻辑实现求助
解决方案
你当前的CASE语句仅覆盖了Left >= Allowed的场景,且赋值错误(应该返回Allowed而非Left),其余场景会被赋值为NULL,没有匹配后续规则。
核心逻辑说明
所有计算的前提是行的滚动顺序按id升序排列(如果你的滚动计算用了其他排序字段,替换对应字段即可),我们需要先拿到两个关键全局值:
- 最后一个
Left为正的行对应的Left值 - 第一个
Left小于0的行的id
可直接运行的SQL示例
以主流支持窗口函数的数据库(MySQL8.0+、PostgreSQL、SQL Server)为例,用CTE先计算辅助值再关联更新:
WITH aux_calc AS ( SELECT -- 取最后一个正Left对应的Left值 MAX(CASE WHEN `Left` > 0 THEN `Left` END) AS last_pos_left, -- 取第一个Left小于0的行id MIN(CASE WHEN `Left` < 0 THEN id END) AS first_neg_id, -- 取最后一个正Left的行id MAX(CASE WHEN `Left` > 0 THEN id END) AS last_pos_id FROM 你的表名 ORDER BY id ASC ) UPDATE 你的表名 t JOIN aux_calc a SET t.Final = CASE -- 规则1:Left >= Allowed时取Allowed WHEN t.`Left` >= t.Allowed THEN t.Allowed -- 规则2:匹配你给出的预期,最后一个正Left的行返回自身Left值 WHEN t.id = a.last_pos_id THEN t.`Left` -- 规则3:如果需要第一个负Left行取最后正Left值,取消下一行注释即可 -- WHEN t.id = a.first_neg_id THEN a.last_pos_left ELSE 0 END;
注意事项
Left是SQL保留字,查询时需要用反引号(MySQL)、双引号(PostgreSQL/SQL Server)包裹避免语法报错- 如果你的数据库版本不支持CTE,可以把辅助值改成子查询嵌套实现,逻辑完全一致
内容的提问来源于stack exchange,提问作者Jehanzaib Ejaz
相关产品推荐
相关产品推荐

