2017-03-31 160 views
0

我想從2016-01-01開始選擇第一次有'E'診斷的人員列表。postgresql從最小值中選擇日期

我的代碼看起來像

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 

(包含é..與2016,所以我看到他們)

所有我想要的是消除那些誰在2016年之前有E..的日期,並且僅查看2016年以來第一次使用它的人。

回答

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

需要注意的是,你可以用患者符合條件。如果您需要訪問詳細信息,則可以加入或使用窗口功能。

+0

只爲我的記錄。如何將: 'AND NOT EXISTS( \t從form25.visit V1選擇1 \t \t 其中form25.visit.date = v1.visit.date和v1.visit.date <= '2015年12月31日' )' 比較你的解決方案的性能? –