2009-04-22 8 views
0

데이터에 두 가지 세트가 필요하지만 데이터 품질이 좋지 않기 때문에 추가 된 문제가 있습니다.SSIS가 일치하지 않습니다. Join

두 데이터 세트는 통화 (전화 통화) 및 통신 (전화 통화에 대해 생성 된 레코드)입니다. ID는 각각 call_id 및 comm_id입니다. 통신 레코드에는 join을 수행하기위한 call_ids도 있습니다. 문제는 데이터 수집 시스템이 올바르게 작동하지 않아 특정 통화와 일치하지 않는 수많은 통신이 있다는 것입니다. 모든 전화가 통신을 생성하지는 않습니다.

매일 분석을 수행하기 위해 가입 목록을 만들어야합니다.

  • 그냥 호출,
  • 그냥 컴즈,
  • 링크 통신과 전화 : 문제 때문에 링크의 일부의 부족으로 내가 3 개 별개의 행 유형을 얻을 수 있다는 것입니다.

주어진 날짜에 "Just Comm"행 인 모든 행에 대해 동일한 날짜에 대해 "Just Call"행을 제거해야합니다. 나는 전화에서 어떤 가치도 필요 없어요, 나는 단지 일어난 전화를 알아야합니다. 이렇게하면 "올바른 통신"으로 인해 통신을 만든 호출이 알 필요가있는 "그냥 호출"행이 제거되기 때문에 올바른 행으로 끝납니다.

내 문제는 SSIS에서이를 수행하는 방법입니다. 필자는 필자가 필요로하는 모든 데이터를 포함하고 위에 언급 한 3 행 유형이 혼합되어있는 데이터 세트를 가지고있는 지점에 도달했습니다. "Just Call"행을 삭제하는 과정을 어떻게 추천합니까?

답변

0

는 가입 :

SELECT 
    CL.ID AS CALL_ID, 
    CL.DATE AS CALL_DATE, 
    CM.ID AS COMM_ID, 
    CM.DATE AS COMM_DATE 
FROM 
    CALLS CL 
    FULL JOIN 
    COMMUNICATIONS CM ON 
    (CM.CALL_ID = CALL.ID) 
WHERE 
    (CL.ID IS NULL) OR 
    (CM.ID IS NULL) 

이 (A NULL 통화 ID 또는 통신 ID를 포함하는 모든 행을 반환합니다 즉 "깨진 링크"가있는 것).

SELECT 
    VCC1.CALL_ID, 
    VCC2.CALL_ID 
FROM 
    VCALLS_COMMS VCC1 
    JOIN 
    VCALL_COMMS VCC2 ON 
    (VCC2.COMM_DATE = VCC1.CALL_DATE) 

어쩌면 정확히 아니라 당신이 찾고있는 무엇 :

그런 다음 뷰으로 사용할 수있는 일치하는 날짜 행을 찾기 위해 자신에게 및 가입 (의이 VCALLS_COMMS를 부르 자) 도움이되기를 바랍니다.

+0

그래서 첫 번째 단계는 이미 수행 한 작업입니다. 통신 및 호출에 대한 완전 외부 조인을 통해 3 가지 유형의 행이 모두있는 데이터 세트를 생성합니다. where 절은 "호출 및 통신"인 행을 제거합니다. 보기를 사용하는 두 번째 쿼리는 내가 원하는 것을 수행하지 않습니다. 다음 설명에서 자세히 설명 드리겠습니다 ... –

+0

필적 할만한 통화 및 통신 기록을 모두 갖고 싶습니다. 통화 기록을 시작하고 동일한 날짜의 모든 통신 기록과 일치하는 목록으로 이동하십시오. 각 통신 레코드는 한 번만 사용해야합니다. 통화 기록이 일치하는 날짜와 함께 사용되지 않는 통신을 찾지 못하면 null로 남아 있어야합니다 ... –

+0

무작위로 통화 기록 (일치하지 않는 통신 기록의 수까지)을 건너려고하는 경우 - 어떤 통화 기록이 무작위로 교차할지 그게 남아 있어야합니까? 그들은 당신에게 어떤 가치가 있습니까? 카운트 이상에 관심이 있습니까? 그렇지 않다면 단순히 별도의 쿼리로 계산하지 않는 것이 어떻습니까? – Tomalak

0

SSIS에 대해 잘 모르겠지만 시작하는 SQL을 줄 수 있습니다.

통신에 일치하지 않는 데이터를 무시할 의사가 있으므로 전화에 지나치게 관심이없는 것처럼 보입니다.

SELECT 
    call.call_id, 
    call.some_data, 
    comm.comm._id 
    comm.some_data, 
FROM 
    Communications comm 
    LEFT JOIN Calls call ON call.call_id = comm.call_id 
WHERE 
    <date filter: today> 

이 오늘 당신의 모든 통신을 줄 것입니다 만 제대로 연결되어 이러한 호출과 짝 :

나에게이 전형적인 LEFT 같은 소리는 상황에 가입하세요. 오늘의 다른 모든 호출은 결과 집합에서 끝나지 않을 것입니다.


편집 : 다른 답변에 영업 이익의 코멘트에서

:

나는 타의 추종을 불허하는 전화 및 통신의 모든 레코드를 먹고 싶어

. 통화 기록으로 시작하여 같은 날의 통신 기록과 일치하는 목록을 찾으십시오. 각 통신 기록 은 한 번만 사용해야합니다. 전화 기록 으로 사용되지 않는 통신을 찾을 수없는 경우 일치하는 날짜는 다음이

내가이 접근 방식의 핵심 문제를 볼 ... 널 (null)을 유지해야합니다

은 "전화"기록의 어느 시술 후에 남겨 두어야 할 것이 있습니까?TOP 17 (17은 "통화/통신"- 오늘의 미스 매치 임)? 남은 것은 무엇이든? 최신 통화?

결과 집합에 17 개의 임의의 통화 기록을 남기는 것이 어떤 가치가 있습니까? 그들은 유용한 정보를 전혀 가지고 있지 않습니다. 그들은 당신이 횡단 한 것보다 낫지 않습니다. 당신은 그들을 어딘가에 전시 할 것인가? 왜?

나는 LEFT JOIN (왼쪽 조인)과 함께 나머지를 계산합니다. 내가 완전히 문제를 이해하지만 어쩌면 당신은 FULL OUTER으로 시도 할 수 확실하지 않다

+0

매일 내가 어디에 전화를하는지 알고 있어야하기 때문에 문제가 해결되지 않습니다. 이 솔루션은 필적 할 수없는 모든 전화를 잃어 버릴 것입니다. –

+0

그러면 정확히 필요한 데이터와 개수를 정의해야합니다. 상황과 원하는 출력을 보여주는 작은 예제를 제공하는 것이 가장 좋습니다. – Tomalak