gpt4 book ai didi

postgresql - 将表格中的两行合并为一行

转载 作者:行者123 更新时间:2023-11-29 12:10:33 24 4
gpt4 key购买 nike

我有一个表,我注意到唯一约束设置不正确,表中有重复的行。

我设置了这个 sqlfiddle:http://sqlfiddle.com/#!15/c4a5d/1/0

create table foo (
bad_id INT NOT NULL,
real_id INT NOT NULL,
a TEXT,
b TEXT
);

insert into foo values
(1, 1, 'a1', null),
(2, 1, null, 'b1'),
(3, 1, null, null),
(4, 2, 'a22', 'b2'),
(5, 2, 'a2', 'b22'),
(6, 3, null, null);

我正在尝试通过合并值来修复表格。如果存在较新的行,我想采用这些值(它应该是更新而不是插入)

我想要的最终结果是这样的,在 real_id 上是唯一的

3 | 1 | 'a1' | 'b1'
5 | 2 | 'a2' | 'b22'
6 | 3 | null | null

基本上我希望最终结果看起来好像第一行是插入的,而具有相同 real_id 的任何后续行都是部分更新

我可以使用哪种查询来创建最终结果集?

我正在使用 Postgres 9.4。

如果在 sql 中需要做的事情很糟糕或渐近性能非常差,我应该能够通过将所有行拉到代码(大约 25000),然后手动进行合并来以线性复杂度来完成它。不过,它似乎应该可以在 sql 中使用。

从代码的角度来看,它看起来像一个fold 操作,那么WITH RECURSIVE cte 对我有帮助吗?

最佳答案

试试这个:

  select max(bad_id),
split_part(string_agg(a,'__SPLITER__' order by bad_id DESC),'__SPLITER__',1)
,split_part(string_agg(b,'__SPLITER__' order by bad_id DESC),'__SPLITER__',1)
from foo group by real_id

如果a和b是时间戳:

    select max(bad_id),
split_part(string_agg(a::character varying,'__SPLITER__' order by bad_id DESC),'__SPLITER__',1)::timestamp,
split_part(string_agg(b::character varying,'__SPLITER__' order by bad_id DESC),'__SPLITER__',1)::timestamp
from foo group by real_id

整数相同:split_part(string_agg(a::character varying ...,1)::integer

关于postgresql - 将表格中的两行合并为一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38103733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com