Я не совсем уверен, как лучше сформулировать этот конкретный запрос, поэтому я надеюсь, что заголовок адекватен, однако я попытаюсь описать, что именно мне нужно, чтобы понять, как это сделать. Просто чтобы уточнить, это для оракула sql.
У нас есть таблица, называемая оценками. В этой таблице есть различные виды оценок, однако некоторые оценки должны следовать за другими в логическом порядке и в установленные сроки. Проблемы возникают, когда у клиента есть несколько оценок одного и того же типа, поскольку мы должны использовать довольно неэффективную формулу массива в Excel, чтобы определить, какая «полная» оценка соответствует «первоначальной» оценке.
У меня есть более ранний запрос, который был разрешен на этом сайте ( Возвращает релевантную дату из нескольких таблиц, включая дополнительную информацию о таблице ), которая, как мне кажется, включает в себя много логики для того, что требуется (особенно при определении соответствующее событие, которое произошло в течение указанного периода времени). Однако, хотя этот запрос извлекает данные из 3 отдельных таблиц (оценки, события, обязанности), мне теперь нужно создать запрос, который генерирует аналогичный результат, но извлекает данные из 1 основной таблицы и 2-й таблицы для возврата рабочей информации. Я подумал, что наиболее логичным способом было бы создать запрос, который просматривает таблицу оценки с одним типом оценки, а затем снова присоединяется к таблице оценки (возможно, временной таблице?) С типом оценки, который будет следовать за исходным.
Например:
Таблица 1 (Оценки):
Client ID Assessment Type Start End
P1 1 Initial 01/01/2012 05/01/2012
Таблица 2 (Оценки темп?):
Client ID Assessment Type Start End
P1 2 Full 12/01/2012
Таблица 3:
ID Worker Team
1 Bob Team1
2 Lyn Team2
Результат:
Client ID Initial Start Initial End Initial Worker Full Start Full End
P1 1 01/01/2012 05/01/2012 Bob 12/01/2012
Итак, таблица 1 и таблица 2 взяты из одной и той же таблицы, за исключением того, что они возвращают разные оценки. В идеале должна быть проверка, чтобы убедиться, что «полная» оценка началась в течение X дней после окончания «первоначальной» оценки (аналогично «вероятной» проверке в предыдущем запросе, упомянутом ранее). Если это может быть достигнуто, то, вероятно, стоит упомянуть, что я также был бы заинтересован в расширении этого, чтобы рассмотреть несколько типов оценки, поскольку примерно в цикле клиент может иметь от 4 до 5 различных типов оценки. Буду признателен за любые указания, я уже получил большую помощь от этого сообщества, что очень ценно.
Edit:
Отредактировано для включения решения по совету МБ.
Select
*
From(
Select
I.ASM_SUBJECT_ID as PNo,
I.ASM_ID As IAID,
I.ASM_QSA_ID as IAType,
I.ASM_START_DATE as IAStart,
I.ASM_END_DATE as IAEnd,
nvl(olm_bo.get_ref_desc(I.ASM_OUTCOME,'ASM_OUTCOME'),'') as IAOutcome,
C.ASM_ID as CAID,
C.ASM_QSA_ID as CAType,
C.ASM_START_DATE as CAStart,
C.ASM_END_DATE as CAEnd,
nvl(olm_bo.get_ref_desc(C.ASM_OUTCOME,'ASM_OUTCOME'),'') as CAOutcome,
ROUND(C.ASM_START_DATE -I.ASM_START_DATE,0) as "Likely",
row_number() over(PARTITION BY I.ASM_ID
ORDER BY
abs(I.ASM_START_DATE - C.ASM_START_DATE))as "Row Number"
FROM
O_ASSESSMENTS I
left join O_ASSESSMENTS C
on I.ASM_SUBJECT_ID = C.ASM_SUBJECT_ID
and C.ASM_QSA_ID IN ('AA523','AA1326') and
ROUND(C.ASM_START_DATE - I.ASM_START_DATE,0) >= -2
AND
ROUND(C.ASM_START_DATE - I.ASM_START_DATE,0) <= 25
and C.ASM_OUTCOME <>'ABANDON'
Where I.ASM_QSA_ID IN ('AA501','AA1323')
AND I.ASM_OUTCOME <> 'ABANDON'
AND
I.ASM_END_DATE >= '01-04-2011') WHERE "Row Number" = 1