转置Postgres表中的数据

时间:2019-08-22 15:15:41

标签: postgresql

我需要转置数据,如下表所示。我将需要在任意数量的列上动态地完成此操作(它们可以具有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
...

我们希望将此新结果集与另一个表连接起来。

2 个答案:

答案 0 :(得分:1)

可以使用JSON操作完成转置:

step-by-step demo:db<>fiddle

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. 将值和列名放入一个JSON对象
  2. 将这些列聚合为一个数组
  3. 这些数组元素可以取消嵌套,从而导致每个数组元素在一行上,但全部在同一列中
  4. 此列包含所有生成的JSON对象。因此,最后,您可以解析此JSON列中的原始列名和值,并在两个单独的列中给出它们。

魔术!

答案 1 :(得分:1)

我们去了:

SELECT id,
       unnest(ARRAY['name','field1','field2']) AS field_name,
       unnest(ARRAY["name", "field1", "field2"]) AS new_value
       FROM table