Postgres中数据透视表的主要问题是查询的结果结构(列的数量和名称)不能随所选数据而变化。一种可能的解决方案是动态创建视图,该视图由数据定义。示例函数基于表创建一个视图example_table
:
create or replace function create_pivot_view()
returns void language plpgsql as $$
declare
list text;
begin
select string_agg(format('jdata->>%1$L "%1$s"', name), ', ')
from (
select distinct name
from example_table
) sub
into list;
execute format($f$
drop view if exists example_pivot_view;
create view example_pivot_view as
select lbl, %s
from (
select lbl, json_object_agg(name, value) jdata
from example_table
group by 1
order by 1
) sub
$f$, list);
end $$;
select create_pivot_view();
select *
from example_pivot_view;
lbl | num | colour | percentage
-----+-----+--------+------------
1 | 1 | Red | 25.0
2 | 2 | Green | 50.0
3 | 3 | Blue | 75.0
(3 rows)
请注意,只有在将新名称添加到表中(或从中删除了一些名称)之后,才需要重新创建视图(调用函数)。如果唯一名称集不变,则可以查询视图而无需重新创建。如果对集合进行频繁修改,则创建一个临时视图将是一个更好的选择。
您可能还对JSONB字段中的扁平化聚合键/值对感兴趣?