Разделение одной таблицы на основе критериев и сравнение - PullRequest
1 голос
/ 12 января 2012

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

Ответы [ 2 ]

3 голосов
/ 12 января 2012

Вы можете обращаться к одной и той же таблице несколько раз в данном запросе в SQL, просто используя псевдонимы таблиц. Таким образом, один из способов сделать это будет:

select i.client,
       i.id     initial_id,
       i.start  initial_start,
       i.end    initial_end,
       w.worker initial_worker,
       f.id     full_id,
       f.start  full_start,
       f.end    full_end
from assessments i
join workers w on i.id = w.id
left join assessments f 
       on i.client = f.client and 
          f.assessment_type = 'Full' and
          f.start between i.end and i.end + X 
/* replace X with appropriate number of days */
where i.assessment_type = 'Initial'

Примечание: имена столбцов, такие как end (которые являются зарезервированными словами в Oracle SQL), обычно должны заключаться в двойные кавычки, но из предыдущего вопроса кажется, что это упрощенные версии фактических имен столбцов.

1 голос
/ 12 января 2012

Из вашего поста я предполагаю, что вы используете Oracle здесь (как я вижу "Oracle" в вопросе).

С точки зрения "временных" таблиц, представления приходят на ум. Oracle View может по-разному выглядеть с таблицей, которая выглядит так, как будто вы ищете с различными видами оценок.

Дон Берлесон - хороший источник для всего, что связано с Oracle, и он дает несколько советов по Oracle Views на http://www.dba -oracle.com / concepts / views.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...