我有一个复杂的查询,我需要弄清楚,但我在编写查询和子查询方面不够精通。
问题:我需要检索唯一的患者记录,但如果记录的非null master_patient_id,我需要在该master_patient表上进行子查询或连接并查询最新的(created_at desc限制) 1)该主人的儿童患者。
原因是我们的系统将为同一患者创建一个新的患者记录,如果他们被重新接纳到同一设施。在为给定患者创建第二条记录后,我们还会创建一条master_patient记录,将2条患者记录与其关联,以便系统可以知道他们是同一名患者。
现在,我需要显示非重复患者的清单。因此,我需要一个可以从患者记录中获取患者的查询,但查询master_patient表并仅检索与其master_patient相关的最新患者。
患者表具有:id,name,master_patient_id 并且患者属于master_toient但不需要在场。
主患者表只有一个id和has_many患者。
期望的结果:应该是唯一的患者记录,但是找出患者之间是否是唯一的唯一方法是查询master_patient表以查看是否有任何患者属于它,然后只需检索最新病人(master_patient的孩子)。
我不能将我的查询基于master_patient,因为那些只有1条记录的患者不存在。我应该使用某种类型的连接或子查询吗?
更新:感谢@τεκ我能够调整他的查询以便在Postgres中工作:
更新2:对查询进行1次微调,使其缩短并更正返回的空ID:
SELECT MAX(patients.id) as id, *
FROM "patients"
JOIN (
SELECT MAX(created_at) AS created_at,
patient_master_id,
COALESCE(patient_master_id, id) pm_id
FROM patients
GROUP BY patient_master_id,
COALESCE(patient_master_id, id)
) s
ON (s.pm_id = patients.id or s.patient_master_id = patients.patient_master_id)
AND s.created_at = patients.created_at
GROUP BY patients.id, s.created_at, s.patient_master_id, s.pm_id
答案 0 :(得分:2)
select max(id) as id from patient p
join (select
max(created_at) as created_at,
master_patient_id,
case when master_patient_id is null then id else null end as id
from patient
group by master_patient_id, case when master_patient_id is null then id else null end
) s on (s.id = p.id or s.master_patient_id = p.master_patient_id) and s.created_at = p.created_at
这可能是一种更简单,特定于postgres的方法,但我不知道postgres。在T-SQL中,它是cross apply
。