2014-09-09 5 views
1

Я пишу код, чтобы выбрать пациентов, которые умирают в течение 30 дней после выписки из больницы. Моя проблема заключается в том, что когда у меня есть пациент с несколькими выбросами в течение этого 30-дневного толерантности, он оттягивает несколько рядов! Я попытался решить эту проблему с использованием максимальной даты сброса, которая работала, но когда я добавляю дополнительные столбцы, кажется, что вытягивает определенные элементы из других строк. Вот мой код:Выберите максимум из нескольких столбцов

SELECT MAX(IPS.disch_dttm)    [Discharge Datetime] 
      ,MAX(IPS.IP_SPELL_ID)    [Spell ID]  
      ,pat.PAS_ID      [K Number] 
      ,MAX(IPS.DIS_WARD_ID)    [Ward ID] 
      ,DSSU.SU_DESCRIPTION    [Discharging Ward] 

    FROM Pat_spell AS IPS 
    LEFT JOIN PATIENT PAT  WITH (NOLOCK) ON PAT.DIM_PATIENT_ID = IPS.DIM_PATIENT_ID 
    LEFT JOIN SPECIALTY SPEC WITH (NOLOCK) ON SPEC.DIM_SPECIALTY_ID = IPS.DIM_DIS_SPECT_ID 
    LEFT JOIN SERVICE_UNIT DSSU WITH (NOLOCK) ON IPS.DIM_DIS_WARD_ID = DSSU.DIM_SSU_ID 

    WHERE (IPS.DISCH_DTTM <= PAT.DEATH_DTTM + 30) 
    AND IPS.DIM_DIS_SPECT_ID = '7195' 
    AND IPS.DISCH_DTTM BETWEEN '01/01/2014' AND '30/06/2014' 

    GROUP BY pat.PAS_ID 
      ,pat.DEATH_DTTM 
      ,IPS.DIM_PATIENT_ID 
      ,DSSU.SSU_DESCRIPTION 

    ORDER BY pat.PAS_ID   

Здесь выводится из приведенной выше коды для одной строки, которые я использую для отладки:

Disch Date Event_ID Unique ID Ward ID Discharging Ward 
2014-06-14 8366113 A123456 77085  WardA 

выше получает подопечный ID правильно, но " Discharging Ward "не так. Также Event_ID соответствует предыдущей посещаемости. То, что я пытаюсь достичь, - это вывести только самое последнее событие в течение 30 дней с момента смерти, с «Идентификатором события» в качестве моего уникального идентификатора. Это то, что выход будет выглядеть, если я хотел несколько строк:

Disch Date Event ID Unique ID Ward ID Discharging Ward 
1 2014-06-14 8208846 A123456  77085  Ward B  
2 2014-05-16 8366113 A123456  77036  Ward A 

Это то, что мой вывод должен выглядеть следующим образом:

Disch Date Event_ID Unique ID Ward ID Discharging Ward 
2014-06-14 8208846 A123456 77085  Ward B 

Так, чтобы подвести итог, мой код тянет правильную «дату выписки », правильный« Ward ID », но, похоже, вытащить остальную часть из других строк таблицы. Извинения за огромный вопрос - любая помощь будет оценена, или если это было доведено до смерти, пожалуйста, укажите мне в правильном направлении.

+2

Почему вы засоряете запрос с помощью NOLOCK? Не важна ли точность для этого запроса? Было бы намного легче помочь с некоторыми данными ddl и sample. sqlfiddle.com - отличное место для начала. –

+0

Общим подходом является упрощение этого SQL для выбора уникального идентификатора последней строки. Затем INNER JOIN на этот SQL, используя запрос, который извлекает другую информацию, которую вы хотите. Я могу, возможно, написать образец, если вам нужно. – laughsloudly

+0

@SeanLange 'NOLOCK' заставляет его двигаться быстрее, не так ли? MAGIC TURBO BUTTON FTW !!!! – swasheck

ответ

0

упрощенная версия того, что вам нужно выглядеть так ...

SELECT [DETAIL INFO, no need to MAX or GROUP BY] 
FROM Pat_spell AS IPS 
LEFT JOIN PATIENT PAT  WITH (NOLOCK) ON PAT.DIM_PATIENT_ID = IPS.DIM_PATIENT_ID 
LEFT JOIN SPECIALTY SPEC WITH (NOLOCK) ON SPEC.DIM_SPECIALTY_ID = IPS.DIM_DIS_SPECT_ID 
LEFT JOIN SERVICE_UNIT DSSU WITH (NOLOCK) ON IPS.DIM_DIS_WARD_ID = DSSU.DIM_SSU_ID 
INNER JOIN (
    SELECT PatientID, MAX(IPS.disch_dttm) AS DischargeDt 
    FROM [AllMyTables] 
    WHERE (IPS.DISCH_DTTM <= PAT.DEATH_DTTM + 30) 
    AND IPS.DIM_DIS_SPECT_ID = '7195' 
    AND IPS.DISCH_DTTM BETWEEN '01/01/2014' AND '30/06/2014' 
) t1 ON PAT.PatientID = t1.PatientID AND IPS.disch_dttm = t1.DischargeDt 
ORDER BY pat.PAS_ID 

С ВНУТРЕННЕЙ SQL возвращает 1 строку для каждого пациента, нет необходимости в группе на OUTER SQL.

Если бы у меня было больше данных для работы, я мог бы сшить полный SQL, но, возможно, это указывает на то, что вы в правильном направлении.

+0

Работал шармом, и теперь у меня есть лучшее понимание внутренних запросов. Спасибо за вашу помощь – Mrniceguy

0

Вы получаете максимальное количество каждого поля независимо друг от друга. Если вам нужна строка, соответствующая самой последней дате выписки, вам нужно указать номер строки в порядке убывания, затем выберите, где это = 1. Мы делаем запрос того же типа в течение 30 дней. Так что-то вроде

WITH 
LastDischargeCTE 
AS 
(SELECT pat.PAS_ID [K Number], IPS.disch_dttm [Discharge Datetime], (IPS.IP_SPELL_ID) [Spell ID] 
,(IPS.DIS_WARD_ID) [Ward ID] 
,DSSU.SU_DESCRIPTION [Discharging Ward] 
,ROW_NUMBER() OVER (PARTITION BY pat.PAS_ID ORDER BY IPS.disch_dttm DESC) AS DischargeSequence 

FROM Pat_spell 
LEFT JOIN PATIENT PAT    WITH (NOLOCK) ON PAT.DIM_PATIENT_ID = IPS.DIM_PATIENT_ID 
LEFT JOIN SPECIALTY SPEC   WITH (NOLOCK) ON SPEC.DIM_SPECIALTY_ID = IPS.DIM_DIS_SPECT_ID 
LEFT JOIN SERVICE_UNIT DSSU WITH (NOLOCK) ON IPS.DIM_DIS_WARD_ID = DSSU.DIM_SSU_ID 
WHERE (IPS.DISCH_DTTM <= PAT.DEATH_DTTM + 30) 
AND IPS.DIM_DIS_SPECT_ID = '7195' 
AND IPS.DISCH_DTTM BETWEEN '01/01/2014' AND '30/06/2014' 
) 
SELECT * 
FROM LastDischargeCTE 
WHERE DischargeSequence =1 
+0

Это тоже отлично! Спасибо. – Mrniceguy

Смежные вопросы