Добавление следующей даты встречи - PullRequest
0 голосов
/ 01 июня 2011

У меня есть отчет об отзыве, в котором содержатся письма для каждого пациента, которому необходимо вернуться в кабинет в определенный день на основе плана отзыва (план, который определяет, когда они должны вернуться на основании своего состояния).У меня есть еще одна таблица, в которой хранятся все назначения для каждого пациента (в прошлом и настоящем).Встречи в таблице rev_plans генерируются автоматически, тогда как встречи в таблице встреч создаются вручную.Отчет плана отзыва не проверяется, если человек звонит, чтобы назначить встречу, поэтому в обеих таблицах часто встречается одна и та же встреча, что приводит к отправке дублирующих писем-напоминаний.

Мне нужно сделать две вещи: (Я знаю, что мой подход не обязательно решает бизнес-проблему, но это то, с чем мне нужно)

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

Запрос отчета об отзыве:

SELECT description as [Plan Name], 
per.first_name + ' ' + per.last_name as [Patient],
substring (plan_start_date, 5,2) + '-' +
substring (plan_start_date, 7,2) + '-' + 
substring (plan_start_date, 1,4) as [Plan Start Date],
substring (nr.expected_return_date, 5,2) + '-' +
substring (nr.expected_return_date, 7,2) + '-' + 
substring (nr.expected_return_date, 1,4) as [Expected Return Date] 
FROM recall_plan_mstr rp, 
patient_recall_plans nr, 
patient pt, 
person per
WHERE rp.practice_id = nr.practice_id 
and rp.recall_plan_id = nr.recall_plan_id 
and nr.practice_id = pt.practice_id 
and nr.person_id = pt.person_id 
and per.person_id = pt.person_id 
and (active_plan_ind = 'Y') 
and rp.practice_id = '0025' 

Результаты отчета об отзыве:

PLAN NAME          PATIENT          START      RETURN
------------------ ---------------- ---------- ----------
OFFICE VISIT W/ DR Charles Span     04-18-2011 12-15-2011
LIPID PANEL        Ronald Chap      04-11-2011 06-28-2011
OFFICE VISIT W/ DR Ronald Chap      04-11-2011 04-21-2011
OFFICE VISIT W/ DR Will Thor        03-31-2011 02-01-2012
PACEMAKER CHECK    Sylvia Berkly    05-03-2011 08-03-2011
OFFICE VISIT W/ DR Tim Cayle        04-13-2011 09-26-2011
OFFICE VISIT W/ DR Caferana Mercade 04-11-2011 10-08-2011
OFFICE VISIT W/ DR Susanna Calter   05-10-2011 05-07-2012
ICD CHECK          Jim Southern     04-14-2011 07-13-2011
STRESS ECHO        Don Cobey        04-28-2011 06-07-2010

Запрос о встречах:

select person_id, appt_date
from appointments 
where person_id is not null 
group by person_id, appt_date
order by person_id, appt_date desc

Результаты встреч:

person_id                            appt_date
------------------------------------ ---------
073C8F83-CE15-4192-8E12-00006CB5A433 20091228
073C8F83-CE15-4192-8E12-00006CB5A433 20090510
073C8F83-CE15-4192-8E12-00006CB5A433 20090301
073C8F83-CE15-4192-8E12-00006CB5A433 20081006
378A281C-FAE7-43DF-BC03-00006E386680 20110509
378A281C-FAE7-43DF-BC03-00006E386680 20110217
378A281C-FAE7-43DF-BC03-00006E386680 20110124
378A281C-FAE7-43DF-BC03-00006E386680 20110111
378A281C-FAE7-43DF-BC03-00006E386680 20101207
816D4D31-3C99-4762-878D-000097883B73 20110316
816D4D31-3C99-4762-878D-000097883B73 20101216

Вопросы:

  1. Как я могу составить список из таблицы встреч, в котором по одному пациенту на строку будет толькопоследняя встреча в будущем?Нужно ли для этого писать курсор?
  2. Как я могу объединить этот список в моем отчете об отзыве, чтобы в нем был столбец справа от столбца возврата, который отображает дату следующего визита пациента (только в будущем)?Обе таблицы имеют номер GUID человека.

Надеюсь, я достаточно объяснил и предоставил достаточно информации.Если вам нужна дополнительная информация, пожалуйста, не стесняйтесь спрашивать.

1 Ответ

1 голос
/ 01 июня 2011

Ответ на ваш первый вопрос следующий:

SELECT person_id, min(appt_date) as appt_date
FROM appointments 
WHERE person_id is not null
   AND now() < appt_date -- This line is database specific
GROUP BY person_id
ORDER BY person_id

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

SELECT description as [Plan Name]
  , per.first_name + ' ' + per.last_name as [Patient]
  , substring (plan_start_date, 5,2) + '-' +
    substring (plan_start_date, 7,2) + '-' + 
    substring (plan_start_date, 1,4) as [Plan Start Date]
  , substring (nr.expected_return_date, 5,2) + '-' +
    substring (nr.expected_return_date, 7,2) + '-' + 
    substring (nr.expected_return_date, 1,4) as [Expected Return Date]
  , CASE
      WHEN next_appt.appt_date IS NULL
      THEN ''
      ELSE substring (next_appt.appt_date, 5,2) + '-' +
        substring (next_appt.appt_date, 7,2) + '-' + 
        substring (next_appt.appt_date, 1,4)
    END as [Next Appointment Date]
FROM recall_plan_mstr rp
  JOIN patient_recall_plans nr
    ON rp.recall_plan_id = nr.recall_plan_id
  JOIN patient pt
    ON nr.practice_id = pt.practice_id
      AND nr.person_id = pt.person_id 
  JOIN person per
    ON and per.person_id = pt.person_id
  LEFT JOIN (
        SELECT person_id, min(appt_date) as appt_date
        FROM appointments 
        WHERE person_id is not null
          AND now() < appt_date -- This line is database specific
        GROUP BY person_id
        ORDER BY person_id
      ) next_appt
    ON next_appt.person_id = pt.person_id
WHERE (active_plan_ind = 'Y') 
  AND rp.practice_id = '0025'

Вы заметите, что я отформатировал запрос для разборчивости. См. http://bentilly.blogspot.com/2011/02/sql-formatting-style.html для объяснения, почему я выбираю форматирование SQL так, как я делаю.

...