Postgres 非规范化 CSV 生成
Postgres Denormalized CSV Generation
我有一个 postgres 数据库,其数据结构设置如下。
我有一个评价table和一个处方table。评估可以有许多与之关联的处方。一个处方只能有一个与之关联的评估。
我遇到的问题是我希望能够导出此数据的 CSV 文件。期待,我希望格式全部在 CSV 中的一行中。如果评估有 1 个处方,csv 中应该有一列 prescription_name_1,等等。如果评估有 5 个处方,我希望它扩展为 prescription_name_1、prescription_name_2、prescription_name_3、prescription_name_4、prescription_name_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;
这有点乱七八糟,但类似的方法可能会奏效。假设您的处方 -> 评估关系位于名为 prescription
:
的对象中
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"
我有一个 postgres 数据库,其数据结构设置如下。
我有一个评价table和一个处方table。评估可以有许多与之关联的处方。一个处方只能有一个与之关联的评估。
我遇到的问题是我希望能够导出此数据的 CSV 文件。期待,我希望格式全部在 CSV 中的一行中。如果评估有 1 个处方,csv 中应该有一列 prescription_name_1,等等。如果评估有 5 个处方,我希望它扩展为 prescription_name_1、prescription_name_2、prescription_name_3、prescription_name_4、prescription_name_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;
这有点乱七八糟,但类似的方法可能会奏效。假设您的处方 -> 评估关系位于名为 prescription
:
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"