2013-05-08 2 views
4

센터로 들어와 컨설턴트 (CSO)로 전송되는 통화 흐름을 나타내는 다음 데이터가 있습니다. 내가 데이터를 추출하기 위해 MS SQL 관리 Studio 2005을 사용하고여러 열과 행의 데이터를 기반으로 데이터 추출

CallID Sequence Action   Location   Input NextLocation 

1135  0   CallStart  NULL    NULL  NULL  
1135  1   MenuStart  EFTPosHelpDesk NULL  NULL  
1135  2   KeyPress  EFTPosHelpDesk 3  TransferCSO 
1135  3   TransferEntry EFTPosHelpDesk NULL  NULL 
1135  4   TransferFlag NULL    NULL  NULL 
1135  5   AccessNum  NULL    NULL  NULL 
1135  6   Transfer  NULL    NULL  NULL 
1135  7   Hangup   NULL    NULL  NULL 

그러나 데이터 자체는 MS SQL 2000 서버에 저장됩니다.

사실상 데이터베이스에 수백만 건의 전화가 기록되어 고객이 CSO로 이전 한 CallID의 정보를 추출해야합니다.

@Sequence 2 -> NextLocation = 'TansferCSO' 
@Sequence 3 -> Action = 'TransferEntry' 
@Sequence 4 -> Action = 'TransferFlag' 
@Sequence 5 -> Action = 'AccessNum' 
@Sequence 6 -> Action = 'Transfer' 
@Sequence 7 -> Action = 'Hangup' 

... 그리고 그 순서에 항상 있지만, "순서"가 "위치"어떤 통화로 달라집니다 번호와 다음과 같은 CSO으로 옮겨졌다 내게 전화를 알려줍니다 대상 데이터가 정확하게 평균 50-70 걸음을 달릴 수 있고 우리는 100 개의 IVR (위치)을 가지고 있습니다.

저는 SQL에 익숙하지 않은데, FETCH와 IF/ELSE를 사용했지만 성공하지 못했습니다. ROW_NUMBER()는 MS SQL2000 서버에있는 데이터로 인해 작동하지 않습니다.

모든 예제 또는 조언을 주시면 감사하겠습니다.

+0

초기 시퀀스 번호를 예측할 수없는 경우에도 연속 된 시퀀스 번호에서 작업 패턴이 항상 발생합니까? – HABO

+0

안녕 얘들 아. 예, 연속적으로 발생하지만 번호는 다를 수 있습니다. 예를 들어 NextLocation의 TransferCSO가 시퀀스 33에서 발생할 수 있으므로 34 ~ 38 번 시퀀스는 올바른 "액션"을 찾아야합니다. – CoderX71

+0

나는 테이블에 5 개의 'JOIN'이 나오는 것을 느낍니다. 각각에 대한 조건은 이전 순서 + 1과 다음 예상 조치입니다. 'CallId' /'Sequence'에 인덱스를 넣고'Action'을 포함하면 같은 날의 성능을 제공 할 수 있습니다. 진짜 속임수는 flukey logger를 다루기에 충분한 경사를 조절하고 있습니다. – HABO

답변

1

이것은 (모든 순서로) 존재하는 모든 6 개의 항목을 기반으로 CSO로 전송 된 모든 통화 (CallID)를 제공합니다.

select CallID 
    from yourTable 
    where Action in ('TransferEntry', 'TransferFlag', 
        'AccessNum', 'Transfer', 'Hangup') 
     or NextLocation = 'TransferCSO' 
group by CallID 
    having count(distinct Action) = 6; 

참고 : 가정 NextLocation='TransferCSO'있는 행 다른 하지만 특정 작용을 갖는 것으로하고, 예를 들어 당신이 절대적으로 6 개의 이벤트가 연속되어 있는지 확인해야하는 경우 "키 누름은"


, 당신은 아래에 사용할 수 있습니다. 끝에있는 JOIN 조건에 대한 사소한 변형은 반드시 연속적 일 필요없이 순서대로 사용할 수도 있습니다.

create table #tmpCalls (CallID int, Sequence int, Action varchar(20)); 

select c.CallID, c.Sequence, c.Action 
    from 
(
     select CallID 
     from yourTable 
     where Action in ('TransferEntry', 'TransferFlag', 
         'AccessNum', 'Transfer', 'Hangup') 
      or (Action = 'KeyPress' and NextLocation = 'TransferCSO') 
    group by CallID 
     having count(distinct Action) = 6 
) a 
    join yourTable c on c.CallID = a.CallID 
where c.Action in ('TransferEntry', 'TransferFlag', 
        'AccessNum', 'Transfer', 'Hangup') 
    or (c.Action = 'KeyPress' and c.NextLocation = 'TransferCSO'); 

create clustered index #ix_tmpCalls on #tmpCalls(CallID, Sequence, Action); 

select distinct a.CallID 
    from #tmpCalls a     -- or perhaps just: b.Sequence > a.Sequence 
    join #tmpCalls b on b.Action = 'TransferEntry' and b.Sequence = a.Sequence + 1 
    join #tmpCalls c on c.Action = 'TransferFlag' and c.Sequence = b.Sequence + 1 
    join #tmpCalls d on d.Action = 'AccessNum' and d.Sequence = c.Sequence + 1 
    join #tmpCalls e on e.Action = 'Transfer' and e.Sequence = d.Sequence + 1 
    join #tmpCalls f on f.Action = 'Hangup' and f.Sequence = e.Sequence + 1 
where a.Action = 'KeyPress' and a.NextLocation = 'TransferCSO'; 

하위 쿼리는 후보를 좁히는 데 사용되는 원래 쿼리입니다. 임시 테이블은 3 개의 열을 중심으로 클러스터링 할 수 있으므로 빠르게 수행 할 수 있습니다.

+0

여섯 개의 항목이 모두 필요하지 않습니다. 예를 들어, 일련의 작업 조합에 대해 6 개의 시퀀스 번호 만 있으면됩니다. 전송 3 회, 액세스 3 회. 그것은 가능한 조합 일 수는 없지만, 이해하는 것은 영업일까지입니다. 6 개 이상, 예 : 추가 전송으로 인해 호출이 무시됩니다. – HABO

+0

@HABO 네 말이 맞아. 나는'행동'에 의지하는 것을 정정했다. 감사! – RichardTheKiwi

+0

@ HABO ... 데이터를 업로드하는 로거가 때로는 적합하고 일부 호출이 두 배로 증가하므로 추가 액션이 데이터에있을 수 있습니다. 그러나 전송 동작의 순서는 변경되지 않습니다. – CoderX71