如何基于已生成的patient表数据生成treatment表模拟数据?
生成treatment表模拟数据的方法
方案1:为每个患者生成固定数量的治疗记录
如果需要给每个患者生成指定条数的治疗记录(比如每个患者2条),可以用以下SQL:
WITH vars (treatment_count_per_patient) AS ( VALUES (2) -- 定义每个患者对应的治疗记录数量 ) INSERT INTO treatment (id, patient_pk) SELECT CONCAT('Treat_', ROW_NUMBER() OVER ()) AS id, -- 生成唯一的字符串型id p.pk AS patient_pk FROM patient p CROSS JOIN vars CROSS JOIN generate_series(1, vars.treatment_count_per_patient) WHERE p.tenant_id = 5; -- 筛选之前生成的租户ID为5的患者
方案2:随机生成每个患者的治疗记录数
如果希望每个患者的治疗记录数随机(例如1到5条),可以使用随机函数调整:
INSERT INTO treatment (id, patient_pk) SELECT CONCAT('Treat_', ROW_NUMBER() OVER ()) AS id, p.pk AS patient_pk FROM patient p CROSS JOIN generate_series(1, floor(random() * 5) + 1) -- 随机生成1-5条记录 WHERE p.tenant_id = 5;
方案3:使用数字型唯一id
如果需要id为数字类型的唯一值,直接用行号生成即可:
INSERT INTO treatment (id, patient_pk) SELECT ROW_NUMBER() OVER () AS id, -- 生成自增的数字唯一id p.pk AS patient_pk FROM patient p CROSS JOIN generate_series(1, 3) -- 每个患者生成3条记录 WHERE p.tenant_id = 5;
补充说明
pk列是自动生成的,因此INSERT语句无需指定该列,数据库会自动填充。- 若需要扩展更多字段(如治疗日期、治疗类型),可以在SELECT子句中添加生成逻辑,例如:
-- 示例:添加随机治疗日期和类型 INSERT INTO treatment (id, patient_pk, treat_date, treat_type) SELECT CONCAT('Treat_', ROW_NUMBER() OVER ()) AS id, p.pk AS patient_pk, CURRENT_DATE - (random() * 365)::INT AS treat_date, -- 随机过去一年的日期 CASE floor(random() * 3) WHEN 0 THEN 'Medication' WHEN 1 THEN 'Surgery' ELSE 'Physical Therapy' END AS treat_type FROM patient p CROSS JOIN generate_series(1, 2) WHERE p.tenant_id = 5;
内容的提问来源于stack exchange,提问作者Eran
相关产品推荐
相关产品推荐

