我正在尝试对 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^ 作为组的定义线)来创建组。我尝试过使用滞后,但由于空行的数量是可变的,我不确定如何使其工作。
虽然可以使用窗口函数解决这个问题,但这并不完全简单,我认为最简单的解决方案是自连接前面的行并识别具有最高 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;