2012-05-08 4 views
2

Microsoft는 SQL Server에 익숙하며 2005 버전을 사용하고 있습니다. 내가 할 수있을 필요가있는 무엇반복 호출 비율 찾기

가 와서 반복 호출의 수를 계산합니다.

내가 열 "Daily_Dispo_Date"(날짜)를 호출 한 EP_Call_Int라고 한 표, "로그인"(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 바이올린 링크 http://sqlfiddle.com/#!3/0de9c

에서 모든 테스트 데이터를

무엇을해야합니까? 우리 회사가 반복적으로 전화하는 횟수를 세는 것입니다. 어떻게 계산해야하는지는 5 분에서 3 일 사이의 시간 범위를 사용하는 것입니다. 따라서 첫 사람이 처음으로 전화를 걸면 다시 전화를하면 같은 사람에 대해 두 번 칠 수 없습니다.

은 그래서 같이 내 최종 결과를 얻으려고 노력 메신저 것은 :

은 짧은 그래서
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에서 호출하는 경우 :

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 

쿼리 내가 가지고 지금까지 다음과 같습니다 같은 이유로 2 일 콜백으로 계산됩니다. 그들은 하루에 1, 2에 호출하고 3 경우 내가 그것을 내가 모든 규칙을 잘있어 확실하지 않다 하루 1에 반복과 2

+1

당신이 더 이상 (http://stackoverflow.com/q/10500123/397952) – JNK

답변

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 생각 후 :

,363,210
;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

+0

내가 가진했습니다 SQL 2005에서 작업하려면 "날짜 ([Daily_Dispo_Date])"를 "DateAdd (dd, DateDiff (dd, 0, [Daily_Dispo_Date]), 0)"로 변경하십시오. 쿼리는 훌륭하게 작동하지만 5 분에서 3 일 사이의 반복 프레임을 제한하는 방법을 잘 모릅니다. 나는 병이 "[CallDate]> = DateAdd (mi, 5, [CallDate])"같은 것을 사용하거나 where 절에서 그런 식으로 사용해야한다고 생각하지만, 어디에 넣어야하는지 확실히 모르겠습니다. 도와 주셔서 대단히 감사합니다. @ w0lf – Dave

+0

@Dave 규칙을 이해하겠습니다. 1 일, 2 일, 5 일에 3 번 통화 시나리오를 생각해 봅시다. 첫 번째 호출은 첫 번째 호출, 두 번째 호출은 반복 호출 (3 일 제한 내에 있음)로 간주됩니다. 5 일째 전화는 어때? 1 일부터 3 일 이상 떨어져 있기 때문에 첫 번째 통화입니까? – GolfWolf

+0

5 일에 걸려 오는 전화는 2 일에 반복 전화로 계산됩니다. 각 통화는 하나의 반복 만 가질 수 있습니다 (잘못하지 않은 경우 동일한 사람에게 한 번 이상 올 수 없습니다). 따라서 1 일에 반복 전화가 걸리고 2 일에 반복 전화가 걸립니다. – Dave