MySQL中基于LAG函数与条件判断更新表字段值的实现咨询
MySQL 表更新实现思路(基于LAG窗口函数)
前提说明
仅适用于 MySQL 8.0 及以上版本(支持窗口函数),如果使用低版本MySQL可改用变量关联的方式实现相同逻辑。
步骤1:先验证滞后值计算逻辑(避免误更数据)
先执行查询确认计算出的滞后值符合业务预期,再执行更新操作:
WITH lag_calc AS ( SELECT Ticket_ID, -- 可根据业务需求调整PARTITION BY的分组字段,比如按相同业务域、相同客户分组取滞后值 LAG(closed_date) OVER(PARTITION BY Business_Area, HF_Client_Name ORDER BY closed_date DESC) AS target_lag_value FROM schema.table_name ) SELECT t.Ticket_ID, t.Business_Area, t.HF_Client_Name, t.closed_date, t.Next_Create_date, l.target_lag_value FROM schema.table_name t JOIN lag_calc l ON t.Ticket_ID = l.Ticket_ID -- 筛选出需要更新的行 WHERE t.Next_Create_date != '1900-01-01 00:00:00';
步骤2:执行更新操作
确认查询返回的target_lag_value符合预期后,执行更新:
WITH lag_calc AS ( SELECT Ticket_ID, LAG(closed_date) OVER(PARTITION BY Business_Area, HF_Client_Name ORDER BY closed_date DESC) AS target_lag_value FROM schema.table_name ) UPDATE schema.table_name t INNER JOIN lag_calc l ON t.Ticket_ID = l.Ticket_ID SET t.Next_Create_date = l.target_lag_value WHERE t.Next_Create_date != '1900-01-01 00:00:00' -- 避免无滞后值的行被更新为NULL AND l.target_lag_value IS NOT NULL;
注意事项
- 更新前务必备份表数据,或者在事务中执行更新,确认结果无误后再提交事务
PARTITION BY后的分组字段、ORDER BY的排序规则需要和你的业务取数逻辑对齐,如果不需要分组仅全局按closed_date排序取滞后值,可直接删除PARTITION BY子句
内容的提问来源于stack exchange,提问作者RosaNegra
相关产品推荐
相关产品推荐

