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

SQL如何基于按id排序的下一行val值更新当前行val字段

修复方案

核心问题为不同数据库的UPDATE关联语法存在差异,你的原写法符合SQL Server/PostgreSQL的部分语法规范,但细节需要调整,同时需要注意LEAD函数返回的最后一行下一个值为NULL的场景,可按需选择是否过滤该场景。

MySQL 写法

MySQL不支持UPDATE ... FROM的语法,需要直接关联表:

UPDATE ssc t1
INNER JOIN (
    SELECT id, LEAD(val) OVER(ORDER BY id) AS next_val
    FROM ssc
) t2 ON t1.id = t2.id
SET t1.val = t2.next_val;

如果不想让最后一行的val被更新为NULL,可以加过滤条件:

UPDATE ssc t1
INNER JOIN (
    SELECT id, LEAD(val) OVER(ORDER BY id) AS next_val
    FROM ssc
) t2 ON t1.id = t2.id
SET t1.val = t2.next_val
WHERE t2.next_val IS NOT NULL;

SQL Server 写法

原写法结构正确,调整字段别名避免歧义即可:

UPDATE t 
SET t.val = t2.next_val 
FROM ssc t 
INNER JOIN (
    SELECT id, LEAD(val) OVER(ORDER BY id) AS next_val
    FROM ssc
) t2 ON t.id = t2.id
WHERE t2.next_val IS NOT NULL; -- 不需要更新最后一行就保留该条件,否则删除

PostgreSQL 写法

支持UPDATE ... FROM语法,写法如下:

UPDATE ssc t
SET val = t2.next_val
FROM (
    SELECT id, LEAD(val) OVER(ORDER BY id) AS next_val
    FROM ssc
) t2
WHERE t.id = t2.id
AND t2.next_val IS NOT NULL; -- 不需要更新最后一行就保留该条件,否则删除

效果验证

以你提供的样例数据为例,加了最后一行过滤条件的更新结果如下:

idvaldt
1k2021-01-01
3k22021-05-15
5k22021-10-11

内容的提问来源于stack exchange,提问作者Karan Alang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:42:03