2017-01-05 3 views
3

ИмяТаблицей вызововSQL Последовательных записей с счетом

Field 1 - Phone_number 
Field 2 - System_outcome 

Phone_number  System_outcome DateTime 
-------------------------------------------------- 
07777778999  Answered  18-12-2016 17:15 
07777778123  No Answer  18-12-2016 18:10 
07777778999  No Answer  19-12-2016 19:30 
07777778999  No Answer  19-12-2016 12:15 
07777778999  No Answer  19-12-2016 13:15 
07777778999  No Answer  20-12-2016 11:15 
07777778124  No Answer  20-12-2016 9:15 
07777778128  Answered  20-12-2016 17:15 
07777778074  Answered  20-12-2016 17:15 

Выше приведено примером, что мне нужно, чтобы выяснить, как я найти число, которые не имеют подряд не количества ответов более чем на 6?

на данный момент я смог получить следующее, но это не последовательное.

SELECT phone_number,system_outcome,Datetime 
FROM calls 
WHERE DATE (datetime) BETWEEN '2016-12-23' AND '2016-12-31' 
AND system_outcome = 'NO_ANSWER' 
GROUP BY phone_number 
HAVING count(Phone_number) > 6 

ответ

2

Вы можете использовать переменные для этого.

select phone_number from (
select c.*, 
@prev_outcome:[email protected]_outcome, 
@cur_outcome:=system_outcome, 
@prev_pnum:[email protected]_pnum, 
@cur_pnum:=phone_number, 
case when @cur_pnum = @prev_pnum and @prev_outcome <> @cur_outcome then @rn:[email protected]+1 
    when @cur_pnum = @prev_pnum and @prev_outcome = @cur_outcome then @rn:[email protected] 
else @rn:=1 end as rank 
from calls c, 
(select @rn:=0,@prev_pnum:='',@cur_pnum:='',@prev_outcome:='',@cur_outcome:='') r 
order by phone_number,dt 
    ) x 
where system_outcome='No Answer' 
group by phone_number,rank 
having count(*) > 6 

Этот запрос использует 4 переменные

1) @cur_outcome, который изначально установлен в пустую строку. После этого select присваивает значение system_outcome текущей строки.

2) @prev_outcome, изначально установленный в пустую строку. После этого выбор устанавливает его на @cur_outcome (который является пустой строкой в ​​первый раз и т. Д.).

3) @cur_pnum, который изначально установлен в пустую строку. После этого select назначает номер телефона текущей строки.

4) @prev_pnum, изначально установленный в пустую строку. После этого выбор устанавливает значение @cur_pnum (первоначально это пустая строка).

order by пункт здесь имеет важное значение для обозначения текущей и предыдущей строк на основе номера телефона и даты.

Сначала запустите внутренний запрос, чтобы узнать, как устанавливаются переменные, что прояснит вам все.

Sample Demo

Демо содержит некоторые выборочные данные больше, чем то, что было показано в этом вопросе.

+0

Что делает «select c. *» do? –

+0

где я могу указать дату? до или после заказа –

+0

1) 'select c. *' выбирает все столбцы из табличные вызовы, которые псевдонимы называются 'c' .. 2) Вы можете указать условие where для дат во внутреннем запросе до' order by'. –

2

Для достижения этой цели вы можете использовать определенные пользователем переменные.

Попробуйте это:

SELECT DISTINCT 
    phone_number 
FROM 
    (SELECT 
     phone_number, 
      System_outcome, 
      datetime, 
      @rn:=CASE 
       WHEN 
        @outcome = system_outcome 
         AND @phone = phone_number 
       THEN 
        @rn + 1 
       ELSE @rn:=1 
      END rn, 
      @outcome:=system_outcome, 
      @phone:=phone_number 
    FROM 
     (SELECT 
     phone_number, system_outcome, Datetime 
    FROM 
     calls 
    WHERE DATE (str_to_date(datetime,'%d-%m-%Y %H:%i')) BETWEEN '2016-12-01' AND '2016-12-31' 
    ORDER BY phone_number, str_to_date(datetime,'%d-%m-%Y %H:%i')) t1 
    CROSS JOIN (SELECT @rn:=0, @outcome:='', @phone:='') t2) t 
WHERE 
    rn >= 4 AND system_outcome = 'No Answer'; 

@rn переменные будет присвоен раздел стрелки (разбиение на PHONE_NUMBER и system_outcome по заказу DateTime), а затем фильтр с номером строки и типом результата.

+0

Могут ли я specifiy даты, просто добавив «и» заявление в конце ? –

+0

Я запустил код, и он вернулся. –

+0

Я пробовал с rn> = 2 И system_outcome = «Нет ответа» и весь декабрь, и ничего не отображается только в поле номера телефона и его пустом.Я на 100% уверен, что существует более 1000 экземпляров, где последовательно число помечено как нет ответа. –

0

Вот еще один вариант при условии, что вызовы упорядочены так, как они приходят в

SELECT * FROM (
SELECT if(System_outcome ='Answered', @con:=0, @con:[email protected]+1) id, 
    if(Phone_number = @p, @p, @p:=Phone_number) p2, 
    CASE 
    WHEN Phone_number = @p THEN @con 
    ELSE @con:=0 
    END unanswered_count 
    ,Phone_number, System_outcome, DateTime 
FROM Table1, 
    (SELECT @con:= 0) AS con, 
    (SELECT @p:= -1) AS p 
) agg 
WHERE unanswered_count > 5 

Редакции: некоторые переменные названы неправильно

+0

unasnwered? будет ли это работать? –

+0

@ JoyиalAli Я не тестировал слишком тщательно, но вот короткая скрипка http://sqlfiddle.com/#!9/f876b/1 – badger0053

Смежные вопросы