我需要转置数据,如下表所示。我将需要在任意数量的列上动态地完成此操作(它们可以具有1到100个列),而且我也只想转置一些数据。请注意,最多可以有数百万行。
我们有这样的新数据(从csv读取到临时表中):
id | name | field1 | field2 | field3
1 | igig | a | b | cde
2 | ihiuh | gf | hi | pl
3 | pio | zsfs | oij | ugu
4 | xrxf | iuhi | vxz | pkm
5 | rwtre | xrsd | as | jhb
我们需要做魔术查询来转置这样的结果:
id | column_name | value
1 | name | igig
1 | field1 | a
1 | field2 | b
1 | field3 | cde
2 | name | ihiuh
2 | field1 | gf
2 | field2 | hi
...
我们希望将此新结果集与另一个表连接起来。
答案 0 :(得分:1)
可以使用JSON操作完成转置:
SELECT
id,
elements ->> 'column_name' AS column_name,
elements ->> 'value' AS value
FROM (
SELECT
id,
json_build_object('column_name', 'name', 'value', name) AS name,
json_build_object('column_name', 'field1', 'value', field1) AS field1,
json_build_object('column_name', 'field2', 'value', field2) AS field2,
json_build_object('column_name', 'field3', 'value', field3) AS field3
FROM
mytable
)s,
unnest(ARRAY[name, field1, field2, field3]) AS elements
魔术!
答案 1 :(得分:1)
我们去了:
SELECT id,
unnest(ARRAY['name','field1','field2']) AS field_name,
unnest(ARRAY["name", "field1", "field2"]) AS new_value
FROM table