Как исключить событие, происходящее внутри, но не между двумя или более таймфреймами на большей временной шкале? - PullRequest
0 голосов
/ 21 января 2020

У меня есть набор данных пациентов сети здравоохранения за последние 12 месяцев. Для каждого пациента у меня есть временные метки для проведения определенного теста, временные метки для вводимых антибиотиков, временные метки для поступления в больницу (если они приняты в течение периода времени, охватываемого набором данных) и временные метки для выписки (если выписаны до конца набор данных). Иногда пациенты поступают более одного раза, проходят тест более одного раза и получают препарат более одного раза.

SELECT DISTINCT
    SPatient.PatientSID
    ,Inpatient.AdmitDateTime
    ,Inpatient.DischargeDateTime
    ,LabChem.LabChemCompleteDateTime
    ,Drug.EnteredDateTime
INTO
    #TempTable
FROM
    SPatient
    LEFT JOIN Inpatient
        ON SPatient.PatientSID = Inpatient.PatientSID
    LEFT JOIN LabChem
        ON SPatient.PatientSID = LabChem.PatientSID
    LEFT JOIN Drug
        ON SPatient.PatientSID = Drug.PatientSID

Я хочу видеть только строки, в которых пациенты получали препарат в течение 24 часов после теста, но пока не были допущены. Я получаю набор, включающий один стационарный период и тест, проведенный в другой стационарный период (пациент получал тест и лекарство в течение 24 часов, находясь в стационаре, но стационарный интервал взят из более раннего периода приема!), Так что, очевидно, оба пациента находятся в стационаре временные рамки не учитываются при определении того, следует ли включать метку времени теста.

SELECT
    PatientSID
    ,AdmitDateTime
    ,DischargeDateTime
    ,LabChemCompleteDateTime
    ,EnteredDateTime
FROM
    #TempTable
WHERE
    EnteredDateTime BETWEEN LabChemCompleteDateTime AND DATEADD(HOUR, 24, LabChemCompleteDateTime)
EXCEPT
SELECT
    PatientSID
    ,AdmitDateTime
    ,DischargeDateTime
    ,LabChemCompleteDateTime
    ,EnteredDateTime
FROM
    #TempTable
WHERE
    EnteredDateTime BETWEEN AdmitDateTime AND DischargeDateTime
    OR (
        EnteredDateTime >= AdmitDateTime 
        AND DischargeDateTime IS NULL
    )

А следующий запрос вообще ничего не возвращает.


SELECT
    PatientSID
    ,AdmitDateTime
    ,DischargeDateTime
    ,LabChemCompleteDateTime
    ,EnteredDateTime
FROM
    #TempTable
WHERE
    EnteredDateTime BETWEEN LabChemCompleteDateTime AND DATEADD(HOUR, 24, LabChemCompleteDateTime)
    AND NOT EXISTS (
        SELECT
            PatientSID
            ,AdmitDateTime
            ,DischargeDateTime
            ,LabChemCompleteDateTime
            ,EnteredDateTime
        FROM
            #TempTable 
        WHERE
            EnteredDateTime BETWEEN AdmitDateTime AND DischargeDateTime
            OR (
                EnteredDateTime >= AdmitDateTime 
                AND DischargeDateTime IS NULL
            )
    )
...