对于最终目标,我想创建一个看起来像这样的表:
Table 1
option_ID person_ID option
1 1 B
2 1
3 2 C
4 2 A
5 3 A
6 3 B
这个想法是,一个人最多可以从3个选项中选择2个(在这种情况下,一个人只能选择1个选项)。但是,当我的原始数据格式将3个选项放在一列中时,即:
Table 2
person_ID option
1 B
2 C,A
3 A,B
我通常要做的是在Excel中使用','分隔符来使用'Text to Columns'功能,并手动垂直连接两列。但是,我发现当面对更多选择(例如10甚至20)时,此方法变得不切实际。有没有一种方法可以使用postgresql或其他一些方法从Table 2
到Table 1
?
答案 0 :(得分:0)
您可以使用regexp_split_to_table()
:
select row_number() over () as id,
t.person_id, v.option
from t cross join lateral
regexp_split_to_table(t.option, ',') option
order by person_id, option;
Here是db <>小提琴。
实际上,如果您要每个人身分正好两行:
select row_number() over () as id, t.person_id, v.option
from t cross join lateral
(values (1, split_part(t.option, ',', 1)), (2, split_part(t.option, ',', 2))) v(pos, option)
order by person_id, pos;
答案 1 :(得分:0)
使用string_agg()函数。
select person_ID, string_agg(option, ',') as option
from table1
group by person_ID