使用Postgres、SQL Developer和dBeaver。
我需要通过扫描一系列列(确切地说是36列(来验证数据迁移,以确保从36列中提取两个唯一值。
迁移的规则是:
- 对于表中的每个prg_id,按升序遍历所有chan1..36值
- 将chan1值插入schema.prg.vcn1列
- 遍历剩余的CHAN(即,chan2、chan3等(。如果找到另一个唯一的CHAN,请将其插入vcn2列
- 停止处理此prg_id并继续处理下一个
这一切都发生在同一个表(schema.prg(中。数据示例如下所示。后两列是我正在寻求正确填充的列。下面的示例显示了成功的DB迁移应该是什么样子(我有大约4500行要验证(。
prg_id | 通道1 | 通道2 | >通道3。。。chan36vcn1 | >vcn2||
---|---|---|---|---|---|
5100 | 100 | 262 | 0 | 100262 | |
3252 | 43 | 43 | |||
4272 | 76 | null | null76 | 0 |
您可以使用横向连接按顺序获得唯一的id:
select t.*, c.chans
from t cross join lateral
(select array_agg(chan order by ord) as chans
from (select chan, min(ord) as ord
from (values (1, t.chan1), (2, t.chan2), . . . ) v(ord, chan)
where chan <> 0
group by chan
) c
) c;
我不知道你为什么想要可变数量的列。数组应该执行您想要的操作。您可以使用数组表示法访问数组的元素:chans[1] as vcn1, chans[2] as vcn2, . . .
。