2012-01-12 3 views
1

나는이 특정 검색어를 구별하는 가장 좋은 방법은 잘 모르겠다. 그러나 제목이 적절하기를 바란다. 그러나 나는 그것이 무엇인지를 설명하려고 시도 할 것이다. 하는 법을 이해해야합니다. 명확히하기 위해, 이것은 Oracle SQL을위한 것입니다.기준에 따라 하나의 표를 나누어 비교하기

우리는 assessment라고 불리는 테이블을 가지고 있습니다. 이 표에는 다양한 종류의 평가가 있지만, 일부 평가는 정해진 기간 내에 논리적 인 순서로 다른 평가를 따라야합니다. 클라이언트가 동일한 유형의 여러 평가를 가지고있을 때, '전체'평가가 '초기'평가와 일치하는지 확인하기 위해 상당히 비효율적 인 배열 수식을 사용해야하므로 문제가 발생합니다.

필자는 (특히 지정된 시간 내에 발생한 해당 이벤트를 식별하는 데 필요한) 많은 로직을 포함하고 있다고 생각하는이 사이트 (Returning relevant date from multiple tables including additional table info)에서 해결 된 이전 쿼리가 있습니다. 그러나 해당 쿼리가 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 가지 유형의 평가를 가질 것으로 예상되는주기에 따라 여러 평가 유형을 살펴보기 위해이를 확대하는데도 관심을 가질 수 있습니다. 어떤 조언을 해 주시면 감사하겠습니다. 저는 이미이 커뮤니티에서 많은 도움을 얻었으며 매우 귀중합니다.

편집 :

MBs 조언에 따라 해결책을 포함하도록 편집 됨.

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 
+0

예제 에서처럼 전체 시작을 찾는 조건은 무엇입니까? 테이블간에 일치하는 필드가 없습니까? – Mark

+0

죄송합니다. 평가 테이블에 평가를 함께 연결하는 데 사용되는 클라이언트 ID가 있어야하지만 초기 및 코어 시작 사이에 일정 기간이 필요합니다. 즉 갭은 +/- 20 일을 넘지 않습니다. – bawpie

답변

3

에서 오라클 뷰에 대한 몇 가지 도움말을 제공합니다. 그래서이 일을하는 한 가지 방법은 다음과 같습니다

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 같은 열 이름 (즉, 오라클 SQL에서 예약 된 단어) 일반적으로 이중 인용 수 있지만 이전 질문에서이는 것처럼 보이는한다 실제 열 이름의 단순화 된 버전.

+0

감사합니다.이 말이 맞고 이전 검색어와 통합 할 수있었습니다. 이 라인을 따라 뭔가있을 거라 생각했지만 어떻게 이해할 수가 없었습니다. 지금은 그렇게합니다. 감사합니다! – bawpie

1

귀하의 게시물에서 나는 귀하가 여기 오라클을 사용하고 있다고 가정합니다 (질문에서 "오라클"을 참조하십시오).

"temp"테이블의 경우보기가 마음에 들었습니다. Oracle View를 사용하면 여러 종류의 평가를 통해 원하는 것처럼 들리는 표가 다른 표를 줄 수 있습니다.

돈 Burleson의 오라클이 관련 아무것도에 대한 좋은 소스이며, 그는 당신은 단순히 테이블 별칭을 사용하여 SQL 주어진 쿼리에서 동일한 테이블을 여러 번에 액세스 할 수 있습니다 http://www.dba-oracle.com/concepts/views.htm

+0

감사합니다. 나는 이것에 대해 살펴보고 주위에 머리를 얻을 수 있는지 알아 봅니다! – bawpie

관련 문제