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

PostgreSQL按行分组:填充null值的group_line_num字段

PostgreSQL 填充分组内Null值为前序非Null值

针对你需要将后续Null的group_line_num替换为前一个非Null值(或按unit='PST^'分组)的需求,可以通过窗口函数结合分组标识实现,具体方案如下:

解决方案SQL

SELECT 
    item_id,
    ordered_qty,
    unit,
    line_num,
    -- 取分组内第一个非Null的group_line_num作为填充值
    FIRST_VALUE(group_line_num) OVER (PARTITION BY group_id ORDER BY line_num) AS filled_group_line_num,
    code
FROM (
    SELECT 
        *,
        -- 生成分组ID:遇到unit为PST^或group_line_num非Null时,分组计数+1
        SUM(CASE WHEN unit = 'PST^' OR group_line_num IS NOT NULL THEN 1 ELSE 0 END) 
            OVER (ORDER BY line_num ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS group_id
    FROM your_table_name
    ORDER BY line_num
) AS grouped_data;

代码解释

  1. 内层子查询生成分组ID:
    • 利用SUM() OVER()窗口函数,按line_num排序,每遇到unit='PST^'或group_line_num非Null的行就累加1,让同一组(从标识行到下一个标识行前)的行拥有相同group_id。
  2. 外层查询填充Null值:
    • 通过FIRST_VALUE(group_line_num) OVER(PARTITION BY group_id ORDER BY line_num),在每个分组内取第一个非Null的group_line_num,自动填充该组内所有Null行。

样本数据执行结果

按你的样本数据执行后,filled_group_line_num列会得到如下结果:

item_idordered_qtyunitline_numfilled_group_line_numcode
NP4484140T11PST^77
COL48LPT6PST87NP4484140T
COL48EPT4PST97NP4484140T
COL48BPT1PST107NP4484140T
VP5578135T1PST^5252
ONTP48CPT1PST5352VP5578135T

替代方案(MAX函数)

如果分组内仅首行有group_line_num值,也可以用MAX()函数替代,效果一致:

SELECT 
    item_id,
    ordered_qty,
    unit,
    line_num,
    MAX(group_line_num) OVER (PARTITION BY group_id) AS filled_group_line_num,
    code
FROM (
    SELECT 
        *,
        SUM(CASE WHEN unit = 'PST^' OR group_line_num IS NOT NULL THEN 1 ELSE 0 END) 
            OVER (ORDER BY line_num ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS group_id
    FROM your_table_name
    ORDER BY line_num
) AS grouped_data;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:22:38