2017-03-31 9 views
0

2016-01-01から最初に'E'という診断を受けた人のリストを選択したいと思います。postgresql最小値から日付を選択してください

patients E.. 2013,2014,2016, 2017 

(Eが含まれています。.. 2016年に私はそれらを参照してください)

私が欲しいのは、人々を排除することです:

私のコードは、私が手

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 

結果のように見えます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が \tどこform25.visit.date = v1.visit.dateとv1.visit.date <= '2015年12月31日' form25.visit V1から1 \tを選択) ' パフォーマンスに関して、ソリューションと比較しますか? –

関連する問題