我试图列出患者及其最近的主要保险福利。我有三张桌子,
患者(包含患者人口统计数据)
福利(包含保险福利信息)
rel_pat_ben(将患者表的主键与福利表上的相应键匹配)
我差点解决了这个问题:
SELECT p.patient_id,MAX(b.benefits_id),b.effective_date
来自患者AS p
LEFT JOIN rel_pat_ben AS rpb USING(patient_id)
LEFT JOIN受益AS b ON(rpb.benefits_id = b.benfits_id AND b.order ='primary')
GROUP BY patient_id
使用MAX似乎工作,因为id字段是自动递增的,但是当我发现使用较新信息编辑具有较低id的记录的情况时,我意识到了我的问题。所以,我需要检查'effective_date'字段。
是否有办法只返回每位仅包含最新保险福利的患者的一条记录?
答案 0 :(得分:0)
如果您尝试添加
,该怎么办?ORDER BY b.effective_date DESC
在GROUP BY子句之后?
答案 1 :(得分:0)
这将为每位患者选择最大的effective_date(如果存在):
SELECT p.patient_id, MAX(b.effective_date)
FROM
patients AS p INNER JOIN rel_pat_ben AS rpb USING(patient_id)
INNER JOIN benefits AS b ON (rpb.benefits_id=b.benfits_id AND b.order='primary')
GROUP BY
p.patient_id
这将为每位患者选择最后的福利:
SELECT p.patient_id, b.*
FROM
patients AS p INNER JOIN rel_pat_ben AS rpb USING(patient_id)
INNER JOIN benefits AS b ON (rpb.benefits_id=b.benfits_id AND b.order='primary')
WHERE
(p.patient_id, b.effective_date) IN (
SELECT p.patient_id, MAX(b.effective_date)
FROM
patients AS p INNER JOIN rel_pat_ben AS rpb USING(patient_id)
INNER JOIN benefits AS b ON (rpb.benefits_id=b.benfits_id AND b.order='primary')
GROUP BY
p.patient_id
)
我正在使用INNER JOINS,所以如果患者没有任何好处,就不会退回。