У меня проблемы с получением нужных данных из базы данных Oracle. Любая помощь будет принята с благодарностью. Вот пример того, как выглядит моя таблица:
Table: Vaccinations
Patient_ID | Shot_ID | Series | Date_Taken
-------------------------------------------
123 | 5 | B | 8/1/2011
123 | 5 | 3 | 2/1/2011
123 | 5 | 2 | 1/10/2011
123 | 5 | 1 | 1/1/2011
456 | 3 | 2 | 1/10/2011
456 | 3 | 1 | 1/1/2011
123 | 5 | 2 | 10/1/2010
123 | 5 | 1 | 9/1/2010
Столбец серии указывает, какой выстрел был применен для конкретного Shot_ID
. «B» означает, что бустер был дан, «2» означает «второй», «1» означает «сначала» и т. Д., Но «3» означает максимум, а затем бустеры. Я пытаюсь получить все последние серии снимков для пациента для определенного типа снимков (Shot_ID
). Например, я хочу получить последние серии снимков пациента 123 для Shot_ID
= 5, поэтому я хотел бы вернуть первые четыре записи в этом случае (все столбцы должны быть возвращены в этих строках). Последние два должны быть опущены, потому что новая серия снимков была запущена 01.01.2011. В любом случае, я имею в виду алгоритм, но у меня проблемы с написанием запроса. Это будет выглядеть примерно так:
Получить максимальную дату для пациента 123, shot_id = 5
. Верните строку и посмотрите на ее серию (в данном случае «B»).
Получите следующую наименьшую дату из максимальной даты и посмотрите на ее серию (в данном случае, «3»). Если серия находится между 1 и B, верните строку. Если других записей не существует, завершите запрос.
Получить следующую наименьшую дату из шага 2 и посмотреть на ее серию (в данном случае, '2'). Если серия меньше, чем серия из шага 2, верните строку. В противном случае завершите запрос.
Вы продолжаете повторять эти шаги, пока не доберетесь до series = 1
, который возвращается или пока не достигнете серии, которая больше или равна текущей серии, которая не возвращается. Итак, вывод должен выглядеть так:
123 | 5 | B | 8/1/2011
123 | 5 | 3 | 2/1/2011
123 | 5 | 2 | 1/10/2011
123 | 5 | 1 | 1/1/2011
Этот запрос кажется довольно сложным, но, может быть, я просто его обдумал Спасибо за ваше время.