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

Я пытаюсь создать запрос для медицинской базы данных, которая подсчитывает количество пациентов, которые принимали хотя бы одно лекарство из класса лекарств (лекарств, перечисленных ниже в FAST_MEDS CTE) и имели либо: 1) Диагноз миопатии (список диагнозов в FAST_DX CTE) 2) Лабораторное значение CPK выше 1000 (лабораторное значение в FAST_LABS 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
       )
     )

1 Ответ

0 голосов
/ 22 апреля 2010

Возможно, вам не нужно выделять все ваши определенные запросы 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...