自我加入中的计数(*)不起作用

时间:2015-12-21 14:36:06

标签: sql

我正在尝试根据以下要求编写查询解决方案: " FinalCalledPartyNumber(语音邮件3699)在指定的时间范围内被调用大于X次,例如最后5分钟。"

列如下:

  • ID - 身份栏ex。 101045
  • 姓名 - 电话#呼叫3699. ex。 555-123-4567 - > 3699
  • FinalCalledPartyNumber - 3699
  • DateTimeOrigination - datetime

使用自联接,下面的代码会将调用次数的结果集返回到3699,并在电话系统中触发警报。我需要在3699在5分钟内调用大于X次之后才发出警报。我尝试在Group By之后使用带有Count()的Having子句。但它只有在有计数()> = 1时才有效。如果我改为有计数(*)> = 2或更高,它就不会返回行。

以下粗体 Can not 的语法被更改,它是系统生成的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

1 个答案:

答案 0 :(得分: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的次数应用于调用该号码的每条记录。