Postgres 根据一行中的数据对行进行分组

问题描述 投票:0回答:1

我正在尝试对 postgres 查询上的行进行分组。我有一行数据,其中有一个带有行号的字段。接下来的 3 行为空。我想将它们设置为与第一行相同的值。然后第五行重复该过程。可能有 1 行或多行行号为 null。

这是一个数据示例,通过一个简单的查询来提取我想要的行,按 line_num 排序:

item_id 订购数量 单位 行号 group_line_num 代码
NP4484140T 11 太平洋标准时间^ 7 7
COL48LPT 6 太平洋标准时间 8 NP4484140T
COL48EPT 4 太平洋标准时间 9 NP4484140T
COL48BPT 1 太平洋标准时间 10 NP4484140T
VP5578135T 1 太平洋标准时间^ 52 52
ONTP48CPT 1 太平洋标准时间 53 VP5578135T

我希望 group_line_num 在第一组为空时为 7,在第四组为空时为 52。还可以根据单位更改的位置(以 PST^ 作为组的定义线)来创建组。我尝试过使用滞后,但由于空行的数量是可变的,我不确定如何使其工作。

postgresql lag
1个回答
0
投票

虽然可以使用窗口函数解决这个问题,但这并不完全简单,我认为最简单的解决方案是自连接前面的行并识别具有最高 group_line_num 值的行,该行可用于替换中的空值当前行。

create table example (
    item_id varchar not null,
    ordered_qty integer not null,
    unit varchar not null,
    line_num integer not null,
    group_line_num integer,
    code varchar not null
    );

insert into example (item_id, ordered_qty, unit, line_num, group_line_num, code)
values ('NP4484140T', 11, 'PST^', 7, 7, ''),    
       ('COL48LPT', 6, 'PST', 8, null, 'NP4484140T'),
       ('COL48EPT', 4, 'PST', 9, null, 'NP4484140T'),
       ('COL48BPT', 1, 'PST', 10, null, 'NP4484140T'),
       ('VP5578135T', 1, 'PST^', 52, 52, ''),
       ('ONTP48CPT', 1, 'PST', 53, null, 'VP5578135T');

select item_id,
       ordered_qty,
       unit,
       line_num,
       coalesce(example.group_line_num, previous.group_line_num) as group_line_num,
       code
from example
left join lateral (select previous.group_line_num
                   from example as previous
                   where previous.line_num < example.line_num
                   order by previous.group_line_num desc nulls last
                   limit 1) as previous on true
order by line_num;
© www.soinside.com 2019 - 2024. All rights reserved.