2013-05-08 6 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.

В базе данных записано буквально миллионы вызовов, и мне нужно извлечь CallID, где клиент был переведен в CSO. Цель данных, который говорит мне вызов был переведен в 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' 

... и это всегда в той последовательности, но «Последовательность» нумерация и «Location» будет меняться в некоторых вызовов может работать в среднем на 50 - 70 шагов, и у нас есть 100 из IVR (места).

Я довольно новичок в SQL, и я пробовал использовать FETCH и IF/ELSE, но безуспешно. ROW_NUMBER() не работает из-за данных, находящихся на сервере MS SQL2000.

Примите во внимание любые примеры или рекомендации.

+0

Всегда ли происходит последовательность действий последовательностей последовательных номеров, даже если начальный порядковый номер непредсказуем? – HABO

+0

Привет, ребята. Да, они происходят последовательно, однако нумерация может быть различной, например, TransferCSO в NextLocation может возникать в последовательности 33, поэтому последовательности с 34 по 38 будут там, где мне нужно искать правильные «действия». – CoderX71

+0

Я чувствую, что пять «ПРИСОЕДИНЯЙТЕСЬ» от стола, когда он идет дальше. Условием для каждого является предварительная последовательность + 1 и следующее ожидаемое действие. С индексом 'CallId' /' Sequence' и включающим 'Action', он может обеспечить производительность в тот же день. Настоящий трюк представляет собой достаточное количество промахов для обработки ловушек. – HABO

ответ

1

Это даст вам все вызовы (CallID), которые были переданы в CSO на основе всех 6 присутствующих записей (в любой последовательности).

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' имеет разные , но конкретные действие, например, «KeyPress»


Если вы абсолютно необходимо, чтобы убедиться, что 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'; 

Обратите внимание, что подзапрос является исходным запросом для сужения кандидатов. Временная таблица используется, чтобы заставить ее работать быстро, так как мы можем скопировать ее вокруг трех столбцов.

+0

Это не требует наличия всех шести записей, всего шесть порядковых номеров для любой комбинации действий, например. 3 передачи и 3 AccessNums. Это может быть не возможная комбинация, но это зависит от OP, чтобы понять. Более шести, например. дополнительная передача, вызовет игнорирование вызова. – HABO

+0

@HABO Вы правы. Я исправился, чтобы рассчитывать на «Действие». Благодаря! – RichardTheKiwi

+0

@ HABO ... Наличие дополнительных данных может быть в данных, так как регистратор, который загружает данные, иногда подойдет и удваивает некоторые вызовы. Однако последовательность действий переноса никогда не изменяется. – CoderX71