나는이 특정 검색어를 구별하는 가장 좋은 방법은 잘 모르겠다. 그러나 제목이 적절하기를 바란다. 그러나 나는 그것이 무엇인지를 설명하려고 시도 할 것이다. 하는 법을 이해해야합니다. 명확히하기 위해, 이것은 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
예제 에서처럼 전체 시작을 찾는 조건은 무엇입니까? 테이블간에 일치하는 필드가 없습니까? – Mark
죄송합니다. 평가 테이블에 평가를 함께 연결하는 데 사용되는 클라이언트 ID가 있어야하지만 초기 및 코어 시작 사이에 일정 기간이 필요합니다. 즉 갭은 +/- 20 일을 넘지 않습니다. – bawpie