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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:06:00