如何在UPDATE语句中使用GROUP BY/HAVING实现分组计算并更新字段
分组更新同组最早日期字段SQL实现
需求说明
需对test_table表按id、indicator字段分组,取每组内最早的start_dt值,更新同组下所有记录的earliest_dt字段。
你提供的分组取最小日期子查询缺少和原表的关联匹配逻辑,无法直接用于更新,以下是可直接执行的正确写法:
写法1:MySQL 多表关联更新(执行效率高)
通过JOIN先预计算每个分组的最小日期,再关联原表做批量更新:
UPDATE test_table t1 INNER JOIN ( SELECT id, indicator, MIN(start_dt) AS group_min_dt FROM test_table GROUP BY id, indicator ) t2 ON t1.id = t2.id AND t1.indicator = t2.indicator SET t1.earliest_dt = t2.group_min_dt;
写法2:标准SQL通用写法(兼容PostgreSQL、Oracle、SQL Server等)
通过关联子查询逐行匹配对应分组的最小日期,兼容性更强:
UPDATE test_table t1 SET earliest_dt = ( SELECT MIN(start_dt) FROM test_table t2 WHERE t2.id = t1.id AND t2.indicator = t1.indicator );
效果验证
执行上述任意语句后,表数据将和预期结果完全匹配:
- 同
id+indicator分组下所有记录的earliest_dt统一为该组最小的start_dt - 例如
id=111、indicator=2分组最早日期为07/02,组内2条记录的earliest_dt都会更新为07/02,和样例结果一致。
内容的提问来源于stack exchange,提问作者Doodle
相关产品推荐
相关产品推荐

