postgresql从最小值中选择日期

时间:2017-03-31 13:32:32

标签: sql postgresql

我想选择从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年开始第一次拥有该日期的人。

1 个答案:

答案 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';

请注意,这会为您提供符合条件的患者。如果您需要访问详细信息,可以加入或使用窗口功能。