Спасибо людям, которые ответили на мой вопрос сегодня утром:
SQL Server 2008: счетчик количества ключей в нескольких диапазонах дат
Это расширение, и я не понимаю, как обобщить предыдущие решения для этого случая.
База данных, с которой я работаю, содержит несколько таблиц лекарств, лабораторных показателей и диагнозов для группы пациентов. Аналогичен приведенному выше вопросу:
Для лет х = 1996–2008 гг .:
Я хочу посчитать количество пациентов, которым был назначен конкретный препарат в год x, конкретное лабораторное значение, принятое в год x (этот последний немного отличается!)
и конкретный диагноз, впервые поставленный в 1996 году или позже, который еще не был решен в год х.
РЕДАКТИРОВАТЬ: Оказывается, что pt_id не первичный ключ в любой из таблиц - из того, что я читал SELECT COUNT DISTINCT(pm.pt_id)
(из-за медленного DISTINCT
), но я бы хорошо с решением, которое использовало отличное, если это работало.
Вот запрос только за 2008 год, но я снова хочу запрос, который будет подсчитывать значения для каждого года с 1996 по 2008 год.
SELECT COUNT (pm.pt_id)
FROM dm.medications pm
/*patient was prescribed statins together with fibrates this year*/
WHERE pm.pt_id IN
(
SELECT statins.pt_id
FROM dm.patient_medications statins
INNER JOIN dm.patient_medications other_meds
ON statins.pt_id = other_meds.pt_id
WHERE Year(other_meds.order_dts) = 2008
AND Year(statins.order_dts) = 2008
AND statins.generic_nm in ('Atorvastatin','Cerivastatin')
AND other_meds.generic_nm in ('Clofibrate','Fenofibrate','Gemfibrozil')
)
/* patient had a diagnosis code in the list first diagnosed in 1996 or later and not yet resolved in this year */
WHERE pm.pt_id in
(
SELECT pd.pt_id,
FROM dm.diagnoses pd
WHERE pd.icd9_cd IN('728.89','729.1','710.4','728.3','729.0','728.81','781.0','791.3')
AND Year(pd.init_noted_dts) >= 1996
AND pd.rslvd_dts IS NOT NULL
AND Year(pd.rslvd_dts) >= 2008
)
/* patient had a lab value above 1000 this year */
AND pm.pt_id IN
(
SELECT pl.pt_id
FROM dm.labs pl
WHERE pl.lab_val > 1000
AND pl.lab_val IS NOT NULL
AND pl.lab_val < 999999
AND pl.lab_nm = 'CK (CPK)'
AND Year(pm.order_dts) = 2008
)
/* we have demographic information about this patient */
AND pm.pt_id IN
(
SELECT p.pt_id
FROM mrd.demographics p
)
/* this is a real person */
AND pm.pt_id IS NOT NULL