2013-05-08 29 views
4

我有以下數據代表進入我們中心並轉移到顧問(CSO)的呼叫流程。基於多行和多行數據提取數據

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 Management Studio 2005來提取數據,但數據本身存儲在MS SQL 2000服務器上。

在數據庫中記錄了幾百萬個電話,我需要提取客戶被轉移到CSO的CallID。告訴我一個電話被轉移到一個CSO的目標數據是完全如下:

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

......它總是在序列中,但「序列」編號和「位置」,將一些電話改變平均可以跑50-70步,我們有100個IVR(位置)。

我是相當新的SQL,我試過使用FETCH和IF/ELSE但沒有成功。由於MS SQL2000服務器上的數據,ROW_NUMBER()將無法工作。

任何示例或建議將不勝感激。

+0

即使初始序列號不可預測,操作模式是否始終出現在連續的序列號上? – HABO 2013-05-08 02:50:35

+0

嗨,大家好。是的,它們是連續發生的,但是編號可以不同,例如NextLocation下的TransferCSO可能發生在序列33上,所以序列34到38將是我需要尋找正確「動作」的地方。 – CoderX71 2013-05-08 03:15:35

+0

我覺得自己有五個'JOIN'。每個條件是先前的序列+ 1和下一個預期的操作。使用'CallId' /'Sequence'索引和'Action'可以提供同一天的性能。真正的技巧是容納足夠的污水來處理flukey記錄器。 – HABO 2013-05-08 03:55:53

回答

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

這不需要全部六個條目的存在,只有六個序列號用於任何動作組合,例如, 3個轉移和3個AccessNums。這可能不是一個可能的組合,但是由OP來理解。超過六個,例如一個額外的轉移,將導致該呼叫被忽略。 – HABO 2013-05-08 02:46:30

+0

@HABO你說得對。我已經糾正了依靠'行動'。謝謝! – RichardTheKiwi 2013-05-08 02:52:29

+0

@ HABO ...在數據中可能存在額外的操作,因爲上傳數據的記錄器有時會適合,並且會在某些呼叫中加倍。轉移動作的順序不會改變。 – CoderX71 2013-05-08 03:30:24