Это продолжается с запроса, который ранее был решен с помощью stackoverflow ( Возвращение ближайшей даты к дате в другой таблице ), однако теперь я хочу развить ее немного дальше.
У меня есть следующий SQL:
SELECT *
FROM (SELECT O_ASSESSMENTS.ASM_SUBJECT_ID as "P Number",
O_ASSESSMENTS.ASM_ID as "Assessment ID",
O_ASSESSMENTS.ASM_START_DATE as "Assessment Start",
O_ASSESSMENTS.ASM_END_DATE as "Assessment End",
O_SERVICE_EVENTS.SEV_ID as "Event ID",
O_SERVICE_EVENTS.SEV_ACTUAL_DATE as "Event Start",
O_SERVICE_EVENTS.SEV_OUTCOME_DATE as "Event End",
ROUND(O_ASSESSMENTS.ASM_START_DATE -O_SERVICE_EVENTS.SEV_ACTUAL_DATE,0) as "Likely",
row_number() over(PARTITION BY O_ASSESSMENTS.ASM_ID
ORDER BY abs(O_ASSESSMENTS.ASM_START_DATE - O_SERVICE_EVENTS.SEV_ACTUAL_DATE))as "Row Number"
FROM O_ASSESSMENTS
JOIN O_SERVICE_EVENTS
ON O_ASSESSMENTS.ASM_SUBJECT_ID = O_SERVICE_EVENTS.SEV_SUBJECT_ID
Where O_SERVICE_EVENTS.SEV_CODE IN ('ICS_E3','CPINVEST') AND
O_ASSESSMENTS.ASM_QSA_ID IN ('AA1329','AA521') )
WHERE "Row Number" = 1
По сути, у нас есть две таблицы - o_assessments и o_service_events, и этот SQL возвращает ближайший сервисный случай для оценки.Теперь я хочу включить в запрос дополнительную контекстную информацию, чтобы сделать ее более полезной для конечного пользователя, а именно: имя команды и имя работника.
К сожалению, команда и работник снова находятся в другой таблице (o_responsabilities) и связаны с o_assessments asm_id с res_rec_id.
Проблема в том, что я действительно не уверен, как вызвать эту таблицу в вышеупомянутый sql - так что любой совет будет действительно признателен!
Мне также было интересно, можно ли настроить существующий запрос так, чтобы он возвращал только соответствующие события, когда «вероятное» поле имело разницу в 0 (поскольку что-то большее, вероятно, не связано с этой конкретной оценкой).Я знаю, что могу добавить его в где, но если я добавлю строку
and "Likely" = 0
, он возвращает только оценки с событием, которое не выделит никаких проблем (т. Е. Оценки без соответствующих событий).
Я все время учусь на SQL, но есть много вещей, которые на данный момент кажутся мне действительно непонятными, поэтому любой совет очень ценится!Я не был уверен, следует ли мне изменить исходный запрос или начать новый, поэтому надеюсь, что случайно не нарушил никаких правил.
Редактировать:
Хорошо, следуя решению Маркаэто то, что у меня работает.
SELECT
*
FROM
(SELECT
OAS.ASM_SUBJECT_ID as "P Number",
OAS.ASM_ID as "Assessment ID",
OAS.ASM_START_DATE as "Assessment Start",
OAS.ASM_END_DATE as "Assessment End",
OAS.ASM_AUTH_DATETIME as "Authorisation Date",
nvl(olm_bo.get_ref_desc(OAS.ASM_OUTCOME,'ASM_OUTCOME'),'') as "Outcome",
nvl(olm_bo.get_org_name(ORE.RES_PARTY_OUN_ID),'') as "Team",
nvl(olm_bo.get_per_name(ORE.RES_PARTY_ID),'') as "Worker",
OSE.SEV_ID as "Event ID",
OSE.SEV_ACTUAL_DATE as "Event Start",
OSE.SEV_OUTCOME_DATE as "Event End",
ROUND(OAS.ASM_START_DATE -OSE.SEV_ACTUAL_DATE,0) as "Likely",
row_number() over(PARTITION BY OAS.ASM_ID
ORDER BY
abs(OAS.ASM_START_DATE - OSE.SEV_ACTUAL_DATE))as "Row Number"
FROM O_ASSESSMENTS OAS
INNER JOIN O_RESPONSIBILITIES ORE ON OAS.ASM_ID = ORE.RES_REC_ID
AND ORE.RES_PARTY_OUN_ID = 'TEAM'
LEFT JOIN O_SERVICE_EVENTS OSE ON OAS.ASM_SUBJECT_ID = OSE.SEV_SUBJECT_ID
AND
OSE.SEV_CODE IN ('EVENT')
AND
ROUND(OAS.ASM_START_DATE - OSE.SEV_ACTUAL_DATE,0) >= -7
AND
ROUND(OAS.ASM_START_DATE - OSE.SEV_ACTUAL_DATE,0) <= 7
Where OAS.ASM_QSA_ID IN ('ACODE')
AND
nvl(olm_bo.get_ref_desc(OAS.ASM_OUTCOME,'ASM_OUTCOME'),'') <> 'Abandon' ) WHERE "Row Number" = 1