2010-04-22 56 views
0

我正在嘗試建立一個醫療數據庫的查詢,該數據庫用於計算至少一種藥物(藥物列於下面的FAST_MEDS CTE中)並且具有: 1)肌病的診斷(FAST_DX CTE中的診斷列表) 2)CPK實驗室值超過1000(FAST_LABS CTE中的實驗室值) 和此診斷或實驗室發生在患者使用他汀類藥物後。SQL Server 2008:使用多個dts範圍來建立一組日期

我在下面包含的查詢是這樣做的,假設一旦患者使用他汀類藥物,他們會永遠使用他汀類藥物。第一次CTE收集他汀類藥物患者的第一次確診日期,第二次CTE診斷結果,第三次實驗室檢查結果。在此之後,我計算符合上述標準的那些。

我想要做的是放棄假設,一旦患者接受他汀類藥物治療,他們終身服用。表edw_dm.patient_medications有一個名爲start_dts和end_dts的列。該表格每個處方都有一行,start_dts和end_dts表示處方的開始和結束日期。 End_dts可能爲空,我會假設患者正在服用這種藥物(可能是缺失的記錄,但我對此無能爲力)。如果患者使用兩種不同的他汀類藥物,則開始和結束日期可能會重疊,並且患者可能有多次使用相同藥物的記錄,如顯示3-11-2000至4-5-2003的記錄,以及顯示5-6-2007至7-8-2009的同一位患者。

我想使用這兩列來建立一個查詢,我只計算那些在他們已經服用他汀類藥物或在第一個n期間有實驗室診斷價值或診斷的患者3)月後他們停止服用他汀類藥物。我真的不知道如何改寫第一個CTE來獲取這些信息,以及如何在CTE建立之後進行比較。我知道這是一個模糊的問題,但我真的很難過。有任何想法嗎?

一如既往,先謝謝您。

這裏的當前查詢:

WITH FAST_MEDS AS 
    (
    select distinct 
    statins.mrd_pt_id, min(year(statins.order_dts)) as statin_yr 
    from 
     edw_dm.patient_medications as statins 
     inner join mrd.medications as mrd 
     on statins.mrd_med_id = mrd.mrd_med_id 
     WHERE mrd.generic_nm in (
      'Lovastatin (9664708500)', 
      'lovastatin-niacin', 
      'Lovastatin/Niacin', 
      'Lovastatin', 
      'Simvastatin (9678583966)', 
      'ezetimibe-simvastatin', 
      'niacin-simvastatin', 
      'ezetimibe/Simvastatin', 
      'Niacin/Simvastatin', 
      'Simvastatin', 
      'Aspirin Buffered-Pravastatin', 
      'aspirin-pravastatin', 
      'Aspirin/Pravastatin', 
      'Pravastatin', 
      'amlodipine-atorvastatin', 
      'Amlodipine/atorvastatin', 
      'atorvastatin', 
      'fluvastatin', 
      'rosuvastatin' 
      ) 
     and YEAR(statins.order_dts) IS NOT NULL 
     and statins.mrd_pt_id IS NOT NULL 
    group by statins.mrd_pt_id 
    ) 

    select * 
    into #meds 
    from FAST_MEDS 
    ; 

    --return patients who had a diagnosis in the list and the year that 
    --diagnosis was given 
    with 
    FAST_DX AS 
    (
    SELECT pd.mrd_pt_id, YEAR(pd.init_noted_dts) as init_yr 
     FROM edw_dm.patient_diagnoses as pd 
     inner join mrd.diagnoses as mrd 
      on pd.mrd_dx_id = mrd.mrd_dx_id 
      and mrd.icd9_cd in 
    ('728.89','729.1','710.4','728.3','729.0','728.81','781.0','791.3') 
    ) 
    select * 
    into #dx 
    from FAST_DX; 

    --return patients who had a high cpk value along with the year the cpk 
    --value was taken 
    with 
    FAST_LABS AS 
    (
    SELECT 
     pl.mrd_pt_id, YEAR(pl.order_dts) as lab_yr 
    FROM 
     edw_dm.patient_labs as pl 
     inner join mrd.labs as mrd 
     on pl.mrd_lab_id = mrd.mrd_lab_id 
     and mrd.lab_nm = 'CK (CPK)' 
    WHERE 
     pl.lab_val between 1000 AND 999998 
    ) 
    select * 
    into #labs 
    from FAST_LABS; 

    -- count the number of patients who had a lab value or a medication 
    -- value taken sometime AFTER their initial statin diagnosis 
    select 
    count(distinct p.mrd_pt_id) as ct 
    from 
    mrd.patient_demographics as p 
    join #meds as m 
     on p.mrd_pt_id = m.mrd_pt_id 
    AND 
    (
     EXISTS (
      SELECT 'A' FROM #labs l WHERE p.mrd_pt_id = l.mrd_pt_id 
      and l.lab_yr >= m.statin_yr 
     ) 
     OR 
     EXISTS(
      SELECT 'A' FROM #dx d WHERE p.mrd_pt_id = d.mrd_pt_id 
      AND d.init_yr >= m.statin_yr 
     ) 
    ) 
+0

任何更新或迴應我的答案嗎? – 2010-04-23 14:37:45

+0

事實證明,開始日期和結束日期並不準確,所以此查詢毫無用處。謝謝你的幫助。 – raoulcousins 2010-04-29 17:16:21

回答

0

你可能並不需要選擇所有的CTE的定義的查詢到臨時表。

我認爲你後查詢有以下形式:

WITH FAST_MEDS(PatientID, StartDate, EndDate) AS 
(
    --your query for patients on statins, projecting the patient ID and the start/end date for the medication 
), 
FAST_DX(PatientID, Date) AS 
(
    --your query for patients with certain diagnosis, projecting the patient ID and the date 
), 
FAST_LABS(PatientID, Date) AS 
(
    --your query for patients with certain labs, projecting the patient ID and the date 
) 
SELECT PatientID 
FROM FAST_MEDS 
WHERE PatientID IN (SELECT PatientID FROM FAST_DX WHERE Date BETWEEN StartDate AND EndDate OR EndDate IS NULL AND StartDate < Date) 
    OR PatientID IN (SELECT PatientID FROM FAST_LABS WHERE Date BETWEEN StartDate AND EndDate OR EndDate IS NULL AND StartDate < Date) 
+0

謝謝。如果有單一的藥物記錄,並且藥物治療時間是連續的阻滯,這將起作用。單個病人可能有類似於以下情況的東西:start_dts = 5-3-2001 end_dts = 5-3-2002 atorvastation with start_dts = 7-5-2004 end_dts = 9-1-2004 氟伐他汀與start_dts = 6-2 -2001 end_dts = 7-2-2001 在這種情況下,患者使用他汀類藥物,從5-3-2001到5-3-2002和7-5-2004到9-1-2004。 – raoulcousins 2010-04-22 02:11:33

+0

使用此查詢,如果FAST_MEDS包含具有相同PatientID和不同時間範圍(重疊或其他)的多個記錄,則完全可以接受。這些範圍中的每一個都是在FAST_DX和FAST_LABS的半連接中單獨測試的。您可能需要'SELECT DISTINCT PatientID FROM FAST_MEDS ...',並且您的FAST_MEDS查詢變得更加簡單,如下所示:select statins.mrd_pt_id,statins.start_dts,edw_dm.patient_medications的statins.end_dts作爲statins inner join mrd.medications as mrd on statins.mrd_med_id = mrd.mrd_med_id WHERE mrd.generic_nm in(...)'。 – 2010-04-22 04:19:04