SQL Server 2008: подсчет количества ключей в нескольких диапазонах дат в нескольких таблицах - PullRequest
1 голос
/ 19 января 2010

Спасибо людям, которые ответили на мой вопрос сегодня утром:

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

1 Ответ

1 голос
/ 19 января 2010

Попробуйте это:

SELECT COUNT(*), t1.year
FROM dm.medications pm
 /*patient was prescribed statins together with fibrates this year*/
inner join (
    SELECT statins.pt_id, Year(other_meds.order_dts) as Year
    FROM dm.patient_medications statins 
    INNER JOIN dm.patient_medications other_meds ON statins.pt_id = other_meds.pt_id
        AND Year(other_meds.order_dts) = Year(statins.order_dts)
    WHERE statins.generic_nm in ('Atorvastatin','Cerivastatin')
        AND other_meds.generic_nm in ('Clofibrate','Fenofibrate','Gemfibrozil')
) t1 on pm.pt_id = t1.pt_id
/* patient had a diagnosis code in the list first diagnosed in 1996 or later and not yet resolved in this year */
left outer join 
(
    SELECT pd.pt_id, Year(pd.rslvd_dts) as Year
    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
) t2 on pm.pt_id = t2.pt_id and t1.Year = t2.Year 
/* patient had a lab value above 1000 this year */ 
inner join (
SELECT pl.pt_id, Year(pm.order_dts) as Year
    FROM dm.labs pl
    WHERE pl.lab_val > 1000
        AND pl.lab_val < 999999
        AND pl.lab_nm = 'CK (CPK)'
) t3 on pm.pt_id = t3.pt_id and t2.Year = t3.Year
/* we have demographic information about this patient */
inner join (
    SELECT p.pt_id
    FROM mrd.demographics p    
) t4 on pm.pt_id = t4.pt_id and t3.Year = t4.Year
/* this is a real person */
where pm.pt_id IS NOT NULL
    and t1.year between 1996 and 2008
    and t2.Year is null
group by t1.year
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...