我需要拉出符合某些标准的独特患者

时间:2017-12-28 16:09:09

标签: sql sql-server

我在EventType2之前或之后拉出了从未有过EventType1的person_nbrs。我需要在拥有EventType2之前拉出没有EventType1的person_nbrs。如果它们在EventType2之后有一个EventType1,那么它将被忽略。这是我的查询,它提取在EventType2之前或之后从未有过EventType1的person_nbrs。

SELECT 
    person_nbr, enc_nbr, enc_timestamp 
FROM 
    person p
JOIN  
    patient_encounter pe ON p.person_id = pe.person_id  
JOIN 
    patient_procedure pp ON pe.enc_id = pp.enc_id 
WHERE
    enc_timestamp >= '20170101'
    --EventType2
    AND code_id LIKE '2'    
    --  EventType1
    AND person_nbr NOT IN (SELECT person_nbr
                           FROM person p
                           JOIN patient_encounter pe ON p.person_id = pe.person_id  
                           JOIN patient_procedure pp ON pe.enc_id = pp.enc_id
                           WHERE code_id LIKE '1') 
GROUP BY 
    person_nbr, enc_nbr, enc_timestamp 
ORDER BY 
    person_nbr ;

1 个答案:

答案 0 :(得分:0)

您可以使用聚合和HAVING子句执行此操作:

SELECT p.person_nbr
FROM person p JOIN
     patient_encounter pe
     ON p.person_id = pe.person_id JOIN
     patient_procedure pp
     ON pe.enc_id = pp.enc_id
GROUP BY p.person_nbr
HAVING SUM(CASE WHEN pp.code_id = 2 THEN 1 ELSE 0 END) > 0 AND -- has code 2
       (MAX(CASE WHEN pp.code_id = 1 THEN pe.timestamp END) IS NULL OR
        MAX(CASE WHEN pp.code_id = 1 THEN pe.timestamp END) < MIN(CASE WHEN pp.code_id = 2 THEN pe.timestamp END)  
       ) ;

HAVING子句有两部分:

  • 第一个指定此人的代码= 2。
  • 第二个指定两个条件之一。第一个是没有代码= 1.第二个选择是最新的c = 1时间戳小于最早的代码= 2时间戳。