Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 查找重复呼叫率_Sql Server 2005 - Fatal编程技术网

Sql server 2005 查找重复呼叫率

Sql server 2005 查找重复呼叫率,sql-server-2005,Sql Server 2005,我是SQL Server的新手,使用的是2005版 我需要能够做的是计算进来的重复呼叫的数量 我称之为EP_Call_Int的表包含名为Daily_Dispo_Date datetime、Login nvarchar35、Policy Int、Dispo Nvarcar50的列,其数据如下所示: Daily_Dispo_Date Login Policy Dispo 2012-03-01 10:31:54 b_smith 42484 Cancellation 2012-0

我是SQL Server的新手,使用的是2005版

我需要能够做的是计算进来的重复呼叫的数量

我称之为EP_Call_Int的表包含名为Daily_Dispo_Date datetime、Login nvarchar35、Policy Int、Dispo Nvarcar50的列,其数据如下所示:

Daily_Dispo_Date     Login    Policy  Dispo
2012-03-01 10:31:54  b_smith  42484   Cancellation
2012-03-01 10:45:12  s_tomas  48424   Payment
2012-03-01 11:01:32  b_smith  41546   Billing Question
2012-03-01 11:04:34  s_tomas  42484   Cancellation
2012-03-01 11:15:42  d_jones  48425   Payment
2012-03-01 11:50:02  d_jones  48425   Billing Question
2012-03-01 13:02:09  b_smith  48425   Billing Question
2012-03-02 10:31:54  d_jones  42489   Payment
2012-03-02 10:45:12  s_tomas  48434   Cancellation
2012-03-02 11:01:32  d_jones  41540   Payment
2012-03-02 11:04:34  s_tomas  41546   Billing Question
2012-03-02 11:15:42  d_jones  48417   Payment
2012-03-02 11:50:02  d_jones  44525   Billing Question
2012-03-02 13:02:09  s_tomas  41546   Billing Question
2012-03-03 10:31:54  d_jones  42089   Cancellation
2012-03-03 10:45:12  s_tomas  48434   Cancellation
2012-03-03 11:01:32  d_jones  41440   Cancellation
2012-03-03 11:04:34  s_tomas  41646   Payment
2012-03-03 11:15:42  d_jones  48817   Payment
2012-03-03 11:50:02  d_jones  41546   Payment
2012-03-03 13:02:09  s_tomas  41446   Payment
DECLARE @Start DATETIME, @End DATETIME
SET @Start = '20120401'
SET @End = '20120403'
;With [Find_First_Call] As
(
  Select 
     [Policy]
    ,[Dispo]
    ,Min([Daily_Dispo_Date]) As [Call_Date] --need to figure out how to have reset after each call
  From [EP_Call_Int]
  Group By [Policy], [Dispo]
)
Select 
  DateAdd(dd, DateDiff(dd, 0, [Daily_Dispo_Date]), 0) As [Daily_Dispo_Date]
, [Dispo]
, Count([Dispo]) As [Total_Calls]
,(
 Select
   Count([EP_Call_Int2].[Dispo])
 From [EP_Call_Int] as [EP_Call_Int2]
   Left Join [Find_First_Call] as [Find_First_Call] On [Find_First_Call].[Policy] = [EP_Call_Int].[Policy]
   And [Find_First_Call].[Dispo] = [EP_Call_Int].[Dispo]
 Where [EP_Call_Int2].[Daily_Dispo_Date] >= DateAdd(n, 5, [Find_First_Call].[Call_Date])
   And [EP_Call_Int2].[Daily_Dispo_Date] <= DateAdd(dd, 3, [Find_First_Call].[Call_Date])
   And DateAdd(dd, 0, [EP_Call_Int].[Daily_Dispo_Date]), 0) = DateAdd(dd, 0, [EP_Call_Int2].[Daily_Dispo_Date]), 0)
) As [Total_Repeat_Calls]
From [EP_Call_Int]
Where [Daily_Dispo_Date] Between @Start And @End
And [Policy] Like '[4]____'
Group By DateAdd(dd, [Daily_Dispo_Date], 0), [Dispo]
Order By [Daily_Dispo_Date], [Total_Calls] Desc
我把所有的测试数据都放在一个SQL FIDLE链接中

我想做的是计算我们公司接到的重复电话的数量。我需要使用5分钟到3天的时间范围来计算它们。所以firstdate将是这个人第一次打电话进来,如果他们再次打电话进来,这不能算作对同一个人的双重打击

所以我想让我的最终结果看起来像是:

Daily_Dispo_Date    Dispo             Total_Calls   Total_Repeating
2012-03-01          Cancellation      2             1
2012-03-01          Payment           2             0
2012-03-01          Billing Question  3             2
2012-03-02          Payment           3             0
2012-03-02          Cancellation      1             1
2012-03-02          Billing Question  3             2
2012-03-03          Cancellation      3             0
2012-03-03          Payment           3             0
到目前为止,我的查询如下所示:

Daily_Dispo_Date     Login    Policy  Dispo
2012-03-01 10:31:54  b_smith  42484   Cancellation
2012-03-01 10:45:12  s_tomas  48424   Payment
2012-03-01 11:01:32  b_smith  41546   Billing Question
2012-03-01 11:04:34  s_tomas  42484   Cancellation
2012-03-01 11:15:42  d_jones  48425   Payment
2012-03-01 11:50:02  d_jones  48425   Billing Question
2012-03-01 13:02:09  b_smith  48425   Billing Question
2012-03-02 10:31:54  d_jones  42489   Payment
2012-03-02 10:45:12  s_tomas  48434   Cancellation
2012-03-02 11:01:32  d_jones  41540   Payment
2012-03-02 11:04:34  s_tomas  41546   Billing Question
2012-03-02 11:15:42  d_jones  48417   Payment
2012-03-02 11:50:02  d_jones  44525   Billing Question
2012-03-02 13:02:09  s_tomas  41546   Billing Question
2012-03-03 10:31:54  d_jones  42089   Cancellation
2012-03-03 10:45:12  s_tomas  48434   Cancellation
2012-03-03 11:01:32  d_jones  41440   Cancellation
2012-03-03 11:04:34  s_tomas  41646   Payment
2012-03-03 11:15:42  d_jones  48817   Payment
2012-03-03 11:50:02  d_jones  41546   Payment
2012-03-03 13:02:09  s_tomas  41446   Payment
DECLARE @Start DATETIME, @End DATETIME
SET @Start = '20120401'
SET @End = '20120403'
;With [Find_First_Call] As
(
  Select 
     [Policy]
    ,[Dispo]
    ,Min([Daily_Dispo_Date]) As [Call_Date] --need to figure out how to have reset after each call
  From [EP_Call_Int]
  Group By [Policy], [Dispo]
)
Select 
  DateAdd(dd, DateDiff(dd, 0, [Daily_Dispo_Date]), 0) As [Daily_Dispo_Date]
, [Dispo]
, Count([Dispo]) As [Total_Calls]
,(
 Select
   Count([EP_Call_Int2].[Dispo])
 From [EP_Call_Int] as [EP_Call_Int2]
   Left Join [Find_First_Call] as [Find_First_Call] On [Find_First_Call].[Policy] = [EP_Call_Int].[Policy]
   And [Find_First_Call].[Dispo] = [EP_Call_Int].[Dispo]
 Where [EP_Call_Int2].[Daily_Dispo_Date] >= DateAdd(n, 5, [Find_First_Call].[Call_Date])
   And [EP_Call_Int2].[Daily_Dispo_Date] <= DateAdd(dd, 3, [Find_First_Call].[Call_Date])
   And DateAdd(dd, 0, [EP_Call_Int].[Daily_Dispo_Date]), 0) = DateAdd(dd, 0, [EP_Call_Int2].[Daily_Dispo_Date]), 0)
) As [Total_Repeat_Calls]
From [EP_Call_Int]
Where [Daily_Dispo_Date] Between @Start And @End
And [Policy] Like '[4]____'
Group By DateAdd(dd, [Daily_Dispo_Date], 0), [Dispo]
Order By [Daily_Dispo_Date], [Total_Calls] Desc

因此,简言之,如果有人在3天的时间内因为同样的原因打了3次电话,那么这将被视为2次回电。如果他们在第1天、第2天和第3天打电话,我需要它在第1天和第2天显示一个重复。

我不确定我是否掌握了所有规则,但我认为这可能会做到:

;with Call_ordinal_no as (
  select 
    convert(date, [Daily_Dispo_Date]) as CallDate,
    [Login],
    [Dispo],
    row_number() over (
      partition by 
        convert(date, [Daily_Dispo_Date]),
        [Login],
        [Dispo]
      order by [Daily_Dispo_Date]
    ) as CallNumber
  from [EP_Call_Int]
)
select 
  CallDate as Daily_Dispo_Date,
  Dispo,
  count(*) as Total_Calls,
  sum(case when CallNumber > 1 then 1 else 0 end) as Total_Repeating
from Call_ordinal_no
group by CallDate, Dispo
order by CallDate;
SQLFiddle:

更新:

在更深入地讨论了这些规则之后,我认为这是正确的SQL:

;with calls as (
  select 
    DateAdd(dd, DateDiff(dd, 0, c.[Daily_Dispo_Date]), 0) as CallDate,
    c.[Login],
    c.[Dispo],
    c.[Policy],
    case 
      when first.[Login] is null then 0
      else 1 
    end as IsRepeat
  from [EP_Call_Int] c
  left join [EP_Call_Int] first
    on c.[Login] = first.[Login]
    and c.[Dispo] = first.[Dispo]
    and c.[Policy] = first.[Policy]
    and datediff(minute, first.[Daily_Dispo_Date], c.[Daily_Dispo_Date])
      between 5 and 3 * 24 * 60
)
select 
  CallDate,
  Dispo,
  count(*) as Total_Calls,
  sum(IsRepeat) as Total_Repeating
from calls
group by CallDate, Dispo
order by CallDate, Dispo

SQLFIDLE:

您已经做得比我必须更改convertdate、[Daily_Dispo_Date]到DateAdddd、DateDiffdd、0、[Daily_Dispo_Date],0来使用SQL 2005更进一步了。但这是正确的计数。这个查询非常有效,但我不太确定如何将重复时间从5分钟限制到3天。我想我必须在where子句中使用[CallDate]>=DateAddmi,5[CallDate]或类似的东西,但我不太确定该放在哪里。非常感谢你的帮助@w0lf@Dave让我了解规则。让我们考虑一个场景,在第1, 2和第5天有三个调用。我们考虑第1天的第一个呼叫,第2天的呼叫,重复呼叫,它在3天之内。第五天的电话怎么样?这是否也是第一次通话,因为距离第一天还有3天以上?第五天的通话将被视为第二天的重复通话。每次通话只能重复一次,这样,如果对方没有过错,就不能对同一个人进行多次计数。所以第一天会有一个重复通话,第二天会有一个重复通话。@Dave,那么这三个通话都被认为是重复通话?我不太明白。为什么第一天的电话被认为是重复的?很抱歉我解释得不好。当一个电话进来时,它被认为是第一个电话。当有人以相同的处理方式和策略打电话进来时,如果是在3天内,则视为重复。当有人在第一天打电话时,它被认为是第一个电话。当他们在第二天打电话时,这被认为是重复。当他们在第5天打电话时,第2天被视为重复打电话,但第5天还没有重复。