在PostgreSql中,我有一个这样的表:
mytable
id | samples
1 | 1, 2, 3, 4, 5, 6, 7, 8
我想将这些样本拆分为三个位置的样本,得到如下结果:
id | samples
1 | 1, 2, 3
1 | 4, 5, 6
1 | 7, 8
我尝试使用不当,但结果是:
id | samples
1 | 1
1 | 2
1 | 3
1 | 4
...
你们知道我怎么能这样做?
答案 0 :(得分:0)
您的架构设计 - 存储逗号分隔的整数列表 - 这使得这很难。这不是“矢量”,而是一个字符串。 Don't store lists of values as comma separated strings
您可以通过动态解析字符串来解决此问题,但性能会很糟糕。
使用样本设置:
CREATE TABLE mytable(id integer primary key, samples text);
INSERT INTO mytable(id, samples) VALUES (1, '1, 2, 3, 4, 5, 6, 7, 8');
您可以获取阵列形式:
SELECT id, string_to_array(samples, ', ')::integer[] FROM mytable;
然后将数组拆分成切片并通过以{1}开头(即第一个数组索引位置)加入generate_series
,步长为3,并将结束值转换为字符串数组长度。
WITH mytable_fixed(id, samples) AS (
SELECT id, string_to_array(samples, ', ')::integer[] FROM mytable
)
SELECT
id,
array_to_string(samples[step:step+2], ', ')
FROM mytable_fixed,
LATERAL generate_series(1, array_length(samples, 1), 3) step;