2011-08-24 91 views
2

我在SO中搜索,但無法找到直接答案。醫院,醫學部門(ER,泌尿科,骨科,內科疾病等),醫療手術代碼(檢查,外科手術,MRI,超聲波或其他)和病人訪問日期。檢測日期間隔以外的重複信息

患者就診醫生,醫生開藥,並要求再次進行控制檢查。 如果患者在 10天后返回,(s)他必須向同一家醫院支付另一筆檢查費。爲了獲得考試費用,醫院可以在10天后指定一個日期,告知10天后沒有空位。

表結構是這樣的:

Patient id.no Hospital Medical Branch  Medical Op. Code  Date 
    1     H1    M0    P1   01/05/2011 
    5     H1    M1    P9   03/05/2011 
    3     H2    M0    P2   09/05/2011 
    1     H1    M0    P1   14/05/2011 
    3     H1    M0    P2   20/05/2011 
    5     H1    M2    P9   25/05/2011 
    1     H1    M0    P3   26/05/2011 

這裏,探望病人沒有。由於患者編號爲3和5並不構成問題。 3次訪問不同的醫院和5號患者訪問不同的醫療分支。即使他們在10天內訪問過,他們也會支付考試費用。

然而,患者1在01/05和14/05訪問同一醫院,同一分支並受同樣的過程(P1:檢查)。

26/05不計算,因爲它不是體檢。

我想標記的是同一患者,同一醫院,同一科室和同一醫療手術代碼(即專門體檢:P1),日期範圍超過10天。

所得表的格式:

HOSPITAL  TOTAL NUM. of PATIENTS  NUM. of PATIENTS OUT OF DATE RANGE 
    H1      x        a 
    H2      y        b 
    H3      z        c 

感謝。

+0

感謝所有三個答案,你真的很有幫助。 – bonsvr

回答

2

再一次,它是救援的分析功能。

該查詢使用LAG()函數將YOUR_TABLE中的記錄與表中的前一個(由DATE定義的)匹配記錄(由PATIENT_ID定義)進行鏈接。

select hospital_id 
     , count(*) as total_num_of_patients  
     , sum (out_of_range) as num_of_patients_out_of_range 
from (
    select patient_id 
      , hospital_id 
      , case 
        when hospital_id_1 = hospital_id_0 
        and visit_1 > visit_0 + 10 
        and med_op_code_1 = med_op_code_0 
        then 1 
        else 0 
       end as out_of_range 
    from (
      select patient_id 
        , hospital_id as hospital_id_1 
        , date as visit_1 
        , med_op_code as med_op_code_1 
        , lag (date) over (partition by patient_id order by date) as visit_0 
        , lag (hopital_id) over (partition by patient_id order by date) as hopital_id_0 
        , lag (med_op_code) over (partition by patient_id order by date) as med_op_code_0 
      from your_table 
      where med_op_code = 'P1' 
     ) 
    ) 
group by hospital_id 
/

警告:我沒有測試過這段代碼,所以它可能包含語法錯誤。我將在下次訪問Oracle數據庫時檢查它。

+0

沒有意識到你可以在Oracle中使用CASE語句,只知道DECODE函數。爲此歡呼。不是100%確定你的最內層選擇獲取正確的數據,但你的外部查詢更優雅 - 很好。 –

+0

@APC如果'滯留(med_branch)結束(由patient_id按日期排序)med_branch_0'和'med_branch_1 = med_branch_0'添加後,我認爲它會完成。感謝您的幫助,這是一個乾淨優雅的代碼。 – bonsvr

1

這有點粗糙,因爲我還沒有掌握Oracle DB,但關鍵特徵是相同的:分析函數LAG()。除了它的伴侶功能,LEAD(),它們非常適合幫助處理諸如活動期間的事情。

這裏是我的代碼嘗試:

select n.hospital, COUNT(n.patient_id) as patients_out_of_date_range 
from (
    select * 
    from (
     select d.*, lag(date, 1) over (partition by d.patient_id, d.hospital, d.medical_branch, d.medical_op_code order by d.date) as prev_date 
     from datatable d inner join 
      (
       select d.patient_id, d.hospital, d.medical_branch, d.medical_op_code 
       from datatable d 
       where d.medical_op_code = 'P1' 
       group by d.patient_id, d.hospital, d.medical_branch, d.medical_op_code 
       having COUNT(d.date) > 1 
      ) t on d.patient_id = t.patient_id and d.hospital = t.hospital and d.medical_branch = t.medical_branch and d.medical_op_code = t.medical_op_code 
     ) m 
    where date - prev_date > 10 
    ) n 
group by n.hospital 

就像我說的,這不是測試,但它至少應該讓你在正確的方向開始。

一些參考: http://www.adp-gmbh.ch/ora/sql/analytical/lag.html

http://www.oracle-base.com/articles/misc/LagLeadAnalyticFunctions.php

1

我想這是你想要什麼:

WITH Patient_Visits (Patient_Id, Hospital_Id, Branch_Id, Visit_Date, Visit_Order) as ( 
        SELECT Patient_Id, Hospital_Id, BranchId, Visit_Date, 
          ROW_NUMBER() OVER(PARTITION BY Patient_ID, Hospital_Id, Branch_Id, 
               ORDER_BY Patient_Id, Hospital_Id, Branch_Id, Visit_Date) 
        FROM Hospital_Visits 
        WHERE Procedure_Id = 'P1'), 
    Hospital_Recent_Visits (Hospital_Id, Recent_Visitor_Count) as (
          SELECT a.Hospital_Id, COUNT(DISTINCT a.Patient_Id) 
          FROM Patient_Visits as a 
          JOIN Patient_Visits as b 
           ON b.Hospital_Id = a.Hospital_Id 
            AND b.Branch_Id = a.Branch_Id 
            AND b.Patient_Id = a.Patient_Id 
            AND b.Visit_Order = a.Visit_Order - 1 
            AND b.Visit_Date + 10 > a.Visit_Date 
          GROUP BY a.Hospital_Id, a.Patient_Id), 
    Hospital_Patient_Count (Hospital_Id, Patient_Count) as (
          SELECT Hospital_Id, COUNT(DISTINCT Patient_Id) 
          FROM Hospital_Visits 
          GROUP BY Hospital_Id, Patient_Id) 
SELECT a.Hospital_Id, b.Patient_Count, c.Recent_Visitor_Count 
FROM Hospitals as a 
LEFT JOIN Hospital_Patient_Count as b 
ON b.Hospital_Id = a.Hospital_Id 
LEFT JOIN Hospital_Recent_Visits as c 
ON c.Hospital_id = a.Hospital_Id 

請注意,這是寫和針對DB2系統測試。我認爲Oracle數據庫具有相關的功能,因此查詢仍應按書面形式工作。但是,DB2似乎缺少Oracle擁有的某些OLAP功能(至少是我的版本),這可能會有助於淘汰某些CTE。