SQL-запрос на самую последнюю дату и ограничен другим столбцом - PullRequest
0 голосов
/ 27 августа 2010

У меня есть таблица (PAT_PROCEDURES) с тремя столбцами: Patient_id, method_id, method_date и token_id, в которой хранятся записи о пациентах и ​​процедурах, которым они подверглись, а также дата процедуры;Идентификатор токена - это специальный числовой идентификатор.

У меня также есть другая таблица (PAT_TOKENS) с тремя столбцами Patient_id и token_id, в ней есть подмножество этих пациентов из первой таблицы, но идентификатор токена равен 0. Я пытаюсь обновить идентификатор токена доэто будет самая последняя процедура, выполненная из первой таблицы, где процедуры являются одним из конечного списка IDS процедур .... в основном вот что у меня есть:

merge into pat_tokens t 
using (
  -- select all patients with most recent procedure among procedure IDs (45, 66, 78)
) procs on (t.patient_id = procs.patient_id)
when matched then
 update set t.token_id = procs.token_id

Комментируемый запрос выбораэто то, с чем я борюсь.

Спасибо!

Ответы [ 2 ]

1 голос
/ 27 августа 2010
 select patient_id 
 from PAT_procedure P
  inner join (select procedure_id, max(procedure_date) as last_date
              from PAT_procedure
              where procedure_id in (45, 66, 78)
              group by procedure_id) mx
  on p.procedure_id = mx.procedure_id and p.procedure_date = mx.last_date
0 голосов
/ 27 августа 2010

Вы не сказали, какая СУБД, но предполагаете, что SQL 2008 пока что, поскольку она имеет MERGE ...

UPDATE t
SET t.token_id = x.token_id
FROM
   pat_tokens t
   CROSS APPLY (
      SELECT TOP 1 p.token_id
      FROM pat_procedures p
      WHERE
         p.procedure_id IN (45, 66, 78)
         AND p.patient_id = t.patient_id
      ORDER BY p.procedure_date DESC
    ) x
WHERE t.token_id <> procs.token_id

Я надеюсь, что у вас есть индекс для Patient_id в pat_procedures.Было бы замечательно, если бы он был кластеризованным, или даже лучше, если это некластеризованный индекс с включенными значениями method_id, token_id и method_date, при условии, что некластеризованный индекс уже кластеризованного индекса.Не создавайте этот последний индекс, если он вам не нужен.

Я только что понял, что мог неправильно понять, возможно, это то, что вы имели в виду:

UPDATE t
SET t.token_id = x.token_id
FROM
   pat_tokens t
   CROSS APPLY (
      SELECT TOP 1 p.token_id, p.procedure_id
      FROM pat_procedures p
      WHERE p.patient_id = t.patient_id
      ORDER BY p.procedure_date DESC
    ) x
WHERE
   t.token_id <> x.token_id
   AND x.procedure_id IN (45, 66, 78)

Вот еще один метод, просто отвечая на ваш вопрос для оператора SELECT, который вы ищете на этот раз:

SELECT patient_id
FROM (
   SELECT TOP 1 * WITH TIES
   FROM pat_procedures p
   ORDER BY p.procedure_date DESC
) x
WHERE x.procedure_id IN (45, 66, 78)

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

ОБНОВЛЕНИЕ

Теперь, когда я знаю, что это Oracle, я не смогу просто запросить у вас запрос.

Но язнаю, что Oracle поддерживает оконные функции.Если вы можете перевести любой из моих запросов выше в правильный синтаксис Oracle, который присваивает номер 1 каждой строке с самой последней датой в производной таблице, а затем присоединитесь к той, где идентификаторы процедур верны, у вас должен быть этот.Я попытаюсь вернуться к этому завтра ...

...