MySQL - проверка того, был ли у пациента забронирован другой прием после завершения приема, с разбивкой по дням - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь определить повторное назначение пациента.Я хотел бы получить список встреч, сгруппированных по пациентам и дате, любых встреч, которые они имели в тот день, и какие встречи они могли иметь после этого конкретного дня.Если после этого дня у них было еще одно посещение, это считается повторным назначением.

Таблица назначений выглядит следующим образом:

ApptID: первичный ключ

PatientID: идентификатор IDPatient

ScheduleDate: Время, когда состоялась встреча.

ApptStatus: 3 для завершения, 4 для запланированного.Это может быть посторонним, потому что я хочу искать одну завершенную встречу, которая происходит после другой завершенной встречи, а также запланированные встречи, но я оставил это здесь для ясности.

Это мой запрос до сих пор:

SELECT
    a.PatientID,
    a.ScheduleDate AS CompletedAppointment,
    MIN(futureappt.ScheduleDate) AS NextAppointment,
    CASE
        WHEN MIN(futureappt.ScheduleDate) IS NULL THEN 0
        ELSE 1
    END AS CountPatsReappointed,
    1 AS CountPatsSeen
FROM
    `appointments` a
    LEFT JOIN
        (
            SELECT
                fa.PatientID
              , fa.ScheduleDate AS ScheduleDate
            FROM
                `appointments` fa
            WHERE
                fa.ScheduleDate > NOW()
            GROUP BY
                fa.PatientID
              , fa.ScheduleDate
        )
        futureappt
        ON
            futureappt.PatientID = a.PatientID
WHERE
    a.ApptStatus                      = 3
GROUP BY
    a.PatientID
  , a.ScheduleDate
  , futureappt.ScheduleDate 

Данные, схема и моя попытка это в этой скрипке .

Фактический результат (используя этот идентификатор пациента в качестве примера)

ApptID  PatID   CompletedApp           Next   Reapp    PatSeen
269584    3144    2018-05-25T10:30:00Z    (null)    0    1
269826    3144    2018-05-29T14:45:00Z    (null)    0    1 

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

ApptID  PatID   CompletedApp           Next   Reapp    PatSeen
269584    3144    2018-05-25T10:30:00Z    2018-05-29T14:45:00Z    1    1
269826    3144    2018-05-29T14:45:00Z    (null)    0    1 

Как можно переписать запрос для достижения указанных выше результатов?

1 Ответ

0 голосов
/ 03 июня 2018

Здесь хорошо будет работать оконная функция, но они поддерживаются только в MySQL v8.0.

Вместо этого взгляните на запрос ниже: SQLfiddle .Обратите внимание на присоединение ко второй таблице встреч на fa.ScheduleDate > a.ScheduleDate, и вам не нужно группировать по fa.ScheduleDate

SELECT
    a.PatientID,
    a.ScheduleDate AS CompletedAppointment,
    MIN(futureappt.ScheduleDate) AS NextAppointment,
    CASE
        WHEN MIN(futureappt.ScheduleDate) IS NULL THEN 0
        ELSE 1
    END AS CountPatsReappointed,
    1 AS CountPatsSeen
FROM `appointments` a
LEFT JOIN `appointments` futureappt
    ON futureappt.PatientID = a.PatientID and futureappt.ScheduleDate>a.ScheduleDate
WHERE
    a.ApptStatus                      = 3
GROUP BY
    a.PatientID
  , a.ScheduleDate
...