我正在嘗試建立一個醫療數據庫的查詢,該數據庫用於計算至少一種藥物(藥物列於下面的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
)
)
任何更新或迴應我的答案嗎? – 2010-04-23 14:37:45
事實證明,開始日期和結束日期並不準確,所以此查詢毫無用處。謝謝你的幫助。 – raoulcousins 2010-04-29 17:16:21