我想选择从2016-01-01获得第一次'E'
诊断的人员名单。
我的代码看起来像
SELECT DISTINCT ON(form25.visit.patient_id )
form25.visit.patient_id,
CONCAT(demographics.party.firstname,' ', demographics.party.lastname) AS pacientas,
form25.visit.disease_code,
demographics.party.code,
form25.visit.date,
form25.diagnose.disease_type
FROM form25.visit
JOIN demographics.party
ON form25.visit.patient_id = demographics.party.id
JOIN form25.diagnose
ON form25.visit.patient_id = form25.diagnose.card_id
WHERE form25.visit.disease_code LIKE 'E%'
AND form25.diagnose.disease_type = '+'
AND form25.visit.date >= '2016-01-01'
ORDER BY form25.visit.patient_id, form25.visit.date ASC
我得到的结果:
patients E.. 2013,2014,2016, 2017
(包含E ..与2016年所以我看到了它们)
我想要的只是在2016年之前消除那些拥有E..
日期的人,并且只看到那些从2016年开始第一次拥有该日期的人。
答案 0 :(得分:1)
首先,如果您使用表别名,您的查询将更容易阅读(和写入)。
其次,你可以通过聚合然后查看最短日期来获得你想要的东西:
SELECT v.patient_id, CONCAT(p.firstname, ' ', p.lastname) AS pacientas,
MIN(v.date) as first_date
FROM form25.visit v JOIN
demographics.party p
ON v.patient_id = p.id JOIN
form25.diagnose d
ON v.patient_id = d.card_id
WHERE v.disease_code LIKE 'E%' AND d.disease_type = '+'
GROUP BY patient_id, pacientas
HAVING MIN(v.date) >= '2016-01-01';
请注意,这会为您提供符合条件的患者。如果您需要访问详细信息,可以加入或使用窗口功能。