我是SQL Server的新手,我正在使用2005版本。
我需要做的是计算进来的重复通话次数。
我称之为 EP_Call_Int 的表包含名为“Daily_Dispo_Date”(日期时间),“登录”(nvarchar(35)),“政策”(int),“Dispo”(Nvarcar(50) ))并且数据看起来像这样:
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
我在SQL Fiddle Link http://sqlfiddle.com/#!3/0de9c
中拥有所有测试数据我想做的是计算我们公司获得的重复通话次数。我需要如何计算它们是使用5分钟到3天的时间范围。因此,第一次访问将是该人第一次打电话,如果他们再次打电话,就不能算是对同一个人的双击。
所以我试图让我的最终结果看起来像是:
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
到目前为止我的查询看起来像这样:
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天显示重复。
答案 0 :(得分: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:http://sqlfiddle.com/#!3/0de9c/34
<强>更新强>
在更深入地讨论规则之后,我认为这是正确的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
SQLFiddle:http://sqlfiddle.com/#!3/0de9c/69