SQL-запрос для самой последней даты и ограничен другим столбцом

У меня есть таблица (PAT_PROCEDURES) с тремя столбцами: идентификатор_пациента, идентификатор_процедуры, дата_процедуры и идентификатор токена, в которой хранятся записи о пациентах и ​​процедурах, которые они прошли, а также дата процедуры; идентификатор токена — это специальный числовой идентификатор.

У меня также есть другая таблица (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

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

Благодарность!


person wsb3383    schedule 27.08.2010    source источник


Ответы (1)


Вы не сказали, какая СУБД, но предположили, что сейчас 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

Я очень надеюсь, что у вас есть индекс для пациента_id в pat_procedures. Было бы здорово, если бы он был кластерным или даже лучше, если бы это был некластеризованный индекс с включенными procedure_id, token_id и procedure_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 каждой строке с самой последней датой внутри производной таблицы, а затем присоединитесь к тому, где идентификаторы процедур верны, вы должны это иметь. Завтра постараюсь вернуться к этому...

person ErikE    schedule 27.08.2010
comment
Извините, я забыл упомянуть базу данных, это Oracle - person wsb3383; 27.08.2010