2015-12-21 3 views
0

Я пытаюсь написать решение для запросов на основе следующих требований: «FinalCalledPartyNumber (голосовая почта 3699) вызывается больше, чем X раз в назначенный временной интервал, например последние 5 минуты «.Count (*) in Self Join Не работает

Столбцы заключаются в следующем:

  • ID - столбец идентификаторов ех. 101045
  • Название - телефон # звонок 3699. ex. 555-123-4567 -> 3699
  • FinalCalledPartyNumber - 3699
  • DateTimeOrigination - DateTime

Используя автообъединение, приведенный ниже код возвращает результирующий набор числа вызовов 3699 и огнестойкость предупреждение в телефонной системы. Мне нужно запустить оповещение только после того, как 3699 звонил больше X раз за этот 5-минутный период. Я попытался использовать предложение Have с графом () после группы By. Но он работает только при наличии Count ()> = 1. Если я перейду на «Имея счетчик» (*)> = 2 или выше, он не вернет строки.

Синтаксис ниже выделен жирным шрифтом Невозможно изменить, это системный генератор SWQL.

Select VoipCallDetailsAlert.ID, VoipCallDetailsAlert.Name From VoipCallDetailsAlert 
Join (
SELECT 
vcda2.Name AS vcda2_name, 
vcda2.FinalCalledPartyNumber AS vcda2_FinalCalledPartyNumber, 
vcda2.DateTimeOrigination AS vcda2_DateTimeOrigination 
FROM VoipCallDetailsAlert vcda2 
WHERE FinalCalledPartyNumber = '3699' 
    AND vcda2.DateTimeOrigination > DateAdd(mi, -5, GetDate()) 
Group By vcda2.name, vcda2.FinalCalledPartyNumber,  vcda2.DateTimeOrigination 
) Results ON vcda2_name = VoipCallDetailsAlert.Name 

результат Пример:

ID   Name     FinalCalledPartyNumber DateTimeOrigination 
101045 555-123-4567 -> 3699 3699     12/20/15 5:29 PM 
101049 555-412-4767 -> 3699 3699     12/20/15 5:36 PM 

Спасибо, Dobber

+0

Какая СУБД вы используете? –

+0

По внешнему виду, похоже, это sql-сервер –

+0

Count() не работает, потому что вы также группируете 'vcda2.DateTimeOrigination' .., что, вероятно, уникально .. Также не могу сказать, какая часть вашего запроса не может быть изменен .. можете быть более конкретным – JamieD77

ответ

0
SELECT 
    VoipCallDetailsAlert.ID, 
    VoipCallDetailsAlert.Name 
From 
    VoipCallDetailsAlert 
    JOIN (
     SELECT 
      *, 
      COUNT(*) OVER (PARTITION BY FinalCalledPartyNumber) fcpnCount 
     FROM 
      VoipCallDetailsAlert 
     WHERE    
      FinalCalledPartyNumber = '3699' 
      AND DateTimeOrigination > DATEADD(mi,-5,GETDATE() 
    ) vcda ON VoipCallDetailsAlert.ID = vcda.ID AND fcpnCount >= 2 

COUNT(*) OVER (PARTITION BY FinalCalledPartyNumber) fcpnCount используя применит количество раз, что FinalCalledPartyNumber был вызван к каждой записи, которая называется это число ..

+0

Это сработало. Я пробовал Count (*) Over() на прошлой неделе, но не знал о разделе по частям. Прочитайте об этом несколько минут назад. Этот запрос, вероятно, легко перейдет к следующему вопросу, который будет отвечать на вопрос, может ли быть выпущен номер голосовой почты. «FinalCalledPartyNumber (голосовая почта 3699) вызывается одним и тем же номером CallingPartyNumber больше, чем X раз в течение заданного периода времени. – Dobber