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

求PLSQL语句:按PO_HEADER分组更新LINE_NUM序号

按PO_HEADER分组生成递增LINE_NUM的实现方案

没问题!我帮你整理了几种主流数据库下的实现方案,直接就能套用,完全满足你按PO_HEADER分组生成从1开始的递增序号需求:

MySQL 8.0+ 版本

MySQL 8.0及以上支持窗口函数,用ROW_NUMBER()来实现最简洁直观。你可以用下面的更新语句:

UPDATE your_table t
JOIN (
    SELECT 
        PO_HEADER, 
        ITEM, 
        ROW_NUMBER() OVER (PARTITION BY PO_HEADER ORDER BY ITEM) AS new_line_num
    FROM your_table
) AS sub 
ON t.PO_HEADER = sub.PO_HEADER AND t.ITEM = sub.ITEM
SET t.LINE_NUM = sub.new_line_num;

说明:这里ORDER BY ITEM是指定每组内的排序依据,如果你有更合适的排序字段(比如记录的创建时间),直接替换成对应的字段即可。

PostgreSQL

PostgreSQL可以借助CTE(公共表表达式)结合窗口函数来完成更新:

WITH ranked_data AS (
    SELECT 
        PO_HEADER, 
        ITEM, 
        ROW_NUMBER() OVER (PARTITION BY PO_HEADER ORDER BY ITEM) AS new_line_num
    FROM your_table
)
UPDATE your_table t
SET LINE_NUM = rd.new_line_num
FROM ranked_data rd
WHERE t.PO_HEADER = rd.PO_HEADER AND t.ITEM = rd.ITEM;

同样,ORDER BY ITEM可以根据你的实际排序需求调整。

SQL Server

SQL Server的语法更灵活,直接在CTE里处理排序后就能更新:

WITH ranked_data AS (
    SELECT 
        LINE_NUM,
        ROW_NUMBER() OVER (PARTITION BY PO_HEADER ORDER BY ITEM) AS new_line_num
    FROM your_table
)
UPDATE ranked_data
SET LINE_NUM = new_line_num;

针对旧版本MySQL(低于8.0)的兼容方案

如果你的MySQL版本不支持窗口函数,用变量也能实现:

SET @prev_po = NULL;
SET @line_num = 0;

UPDATE your_table
SET LINE_NUM = CASE
    WHEN PO_HEADER = @prev_po THEN @line_num := @line_num + 1
    ELSE @line_num := 1 AND @prev_po := PO_HEADER
END
ORDER BY PO_HEADER, ITEM;

重要提示

  • 记得把语句里的your_table替换成你实际使用的表名
  • 确保ORDER BY后的字段能正确控制每组内的序号顺序,避免生成的序号不符合预期

内容的提问来源于stack exchange,提问作者Pasha Md

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:38:44