PostgreSQL批量更新相同item记录的inum字段为最大值
PostgreSQL实现按item分组更新inum为组内最大值
原表数据
| name | item | inum |
|---|---|---|
| na1 | k1 | 5 |
| na2 | k1 | 6 |
| na3 | k2 | 7 |
| na4 | k3 | 7 |
| na5 | k3 | 8 |
需求目标
将每个item分组下的所有记录的inum字段更新为该组内inum的最大值,更新后结果如下:
| name | item | inum |
|---|---|---|
| na1 | k1 | 6 |
| na2 | k1 | 6 |
| na3 | k2 | 7 |
| na4 | k3 | 8 |
| na5 | k3 | 8 |
实现代码
方法1:子查询关联更新(适合小数据集)
-- 仅更新需要修改的记录(避免无意义更新) UPDATE your_table t SET inum = (SELECT MAX(inum) FROM your_table WHERE item = t.item) WHERE EXISTS ( SELECT 1 FROM your_table WHERE item = t.item AND inum > t.inum ); -- 如果需要强制更新所有记录(包括已经是最大值的行),可去掉WHERE条件 UPDATE your_table t SET inum = (SELECT MAX(inum) FROM your_table WHERE item = t.item);
方法2:窗口函数+CTE(大数据量更高效)
假设name是表的唯一标识字段(如果有主键,建议用主键关联):
WITH item_max_cte AS ( SELECT name, MAX(inum) OVER (PARTITION BY item) AS group_max_inum FROM your_table ) UPDATE your_table t SET inum = im.group_max_inum FROM item_max_cte im WHERE t.name = im.name;
说明
- 请将代码中的
your_table替换为你的实际表名 - 如果表有主键(比如
id),方法2中用主键关联比name更可靠,避免name重复导致的错误
内容的提问来源于stack exchange,提问作者user22426344
相关产品推荐
相关产品推荐

