Postgresql Postgres非规范化CSV生成

Postgresql Postgres非规范化CSV生成,postgresql,csv,export-to-csv,Postgresql,Csv,Export To Csv,我有一个postgres数据库,其数据结构如下所示 我有一张评估表和一张处方表。评估可以有许多与之相关的处方。一个处方只能有一个与之关联的评估 我遇到的问题是,我希望能够导出此数据的CSV。除此之外,我希望格式都在CSV中的一行上。如果评估有1个处方,csv中应该有一列用于处方名称等。如果评估有5个处方,我希望它扩展到处方名称1、处方名称2、处方名称3、处方名称4、处方名称5。有效地去规范化这些数据 不确定这在数据库中是否可行,或者对于这种类型的逻辑,我是否必须坚持使用应用层。查询,获取非规范化

我有一个postgres数据库,其数据结构如下所示

我有一张评估表和一张处方表。评估可以有许多与之相关的处方。一个处方只能有一个与之关联的评估

我遇到的问题是,我希望能够导出此数据的CSV。除此之外,我希望格式都在CSV中的一行上。如果评估有1个处方,csv中应该有一列用于处方名称等。如果评估有5个处方,我希望它扩展到处方名称1、处方名称2、处方名称3、处方名称4、处方名称5。有效地去规范化这些数据


不确定这在数据库中是否可行,或者对于这种类型的逻辑,我是否必须坚持使用应用层。

查询,获取非规范化数据:

SELECT evaluation.name || '_' || CASE WHEN prescription.counts IS NULL
  THEN 0
                           ELSE prescription.counts END
  AS denormalized_name
FROM evaluations evaluation LEFT OUTER JOIN (
                                  SELECT
                                    count(id) counts,
                                    evaluation_id
                                  FROM prescription
                                  GROUP BY evaluation_id
                                ) prescription
    ON evaluation.id = prescription.evaluation_id
然后,您可以通过以下方式将其复制到csv:

Copy (%query%) To '/var/test.csv' With CSV;

这是一个有点黑客,但类似的东西可能会工作。假设您的处方->评估关系位于名为
处方
的对象中:

create table prescription (
  prescription_name text,
  evaluation_name text
);
然后可以使用数组,将其转换为文本,然后去掉呈现数组的视觉元素--开始和结束的花括号:

with array_query as (
  select
    p1.evaluation_name, array (
      select p2.prescription_name
      from prescription p2
      where p1.evaluation_name = p2.evaluation_name
    )::text as prescriptions
  from
    prescription p1
  group by
    p1.evaluation_name
)
select
  evaluation_name || ',' ||
  replace (replace (prescriptions, '{', ''), '}', '')
from array_query
输入:

insert into prescription values ('Prescription 1', 'Eval 1');
insert into prescription values ('Prescription 2', 'Eval 1');
insert into prescription values ('Prescription 3', 'Eval 1');
insert into prescription values ('Prescription 4', 'Eval 2');
insert into prescription values ('Prescription 5', 'Eval 2');
insert into prescription values ('Prescription 6', 'Eval 2');
insert into prescription values ('Prescription 7', 'Eval 2');
输出:

Eval 2,"Prescription 4","Prescription 5","Prescription 6","Prescription 7"
Eval 1,"Prescription 1","Prescription 2","Prescription 3"