sql count/sum the number of calls until a specific date in another column

邮差的信 提交于 2019-12-10 15:39:34

问题


I have data that shows the customer calls. I have columns for customer number, phone number(1 customer can have many), date record for each voice call and duration of a call. Table looks lie below example.

CusID |  PhoneNum   |  Date             | Duration
20111    43576233   20.01.2016-14:00     00:10:12
20111    44498228   14.01.2016-15:30     00:05:12
20112    43898983   14.01.2016-15:30     

What I want is to count the number of call attempts for each number before It is answered(Duration is > 0). So that I can estimate how many time I should call on average to reach a customer or phone number. It should basically count any column per phone number before min(Date) where duration is >0.

SELECT Phone, Min(Date) FROM XX WHERE Duration IS NOT NULL GROUP BY Phone -- 

I think This should give me the time limit until when I should count the number of calls. I could not figure out how to finish the rest of the job

EDIT- I will add an example

And the result should only count row number 5 since it is the call before the customer is reached for the first time. So resulted table should be like :


回答1:


Your first step is valid:

    SELECT
        CusID
        ,PhoneNum
        ,MIN(Date) AS MinDate
    FROM XX
    WHERE Duration IS NOT NULL
    GROUP BY CusID, PhoneNum

This gives you one row per PhoneNum with the date of the first successful call.

Now join this to original table and leave only those rows that have a prior date (per PhoneNum). Group it by PhoneNum again and count. The join should be LEFT JOIN to have a row with zero count for numbers that were answered on the first attempt.

WITH
CTE
AS
(
    SELECT
        CusID
        ,PhoneNum
        ,MIN(Date) AS MinDate
    FROM XX
    WHERE Duration IS NOT NULL
    GROUP BY CusID, PhoneNum
)
SELECT
    CusID
    ,PhoneNum
    ,COUNT(XX.PhoneNum) AS Count
FROM
    CTE
    LEFT JOIN XX
        ON  XX.PhoneNum = CTE.PhoneNum
        AND XX.Date < CTE.MinDate
GROUP BY CusID, PhoneNum
;

If a number was never answered, it will not be included in the result set at all.




回答2:


Please try this query:

SELECT phonecalls.CusID, COUNT(0) AS failedcalls, phonenumber, success.firstsuccess FROM phonecalls, 
(SELECT min(Date) AS firstsuccess, CusID, phonenumber FROM phonecalls WHERE Duration IS NOT NULL GROUP BY CusID, phonenumber) success
WHERE phonecalls.CusID = success.CusID AND phonecalls.phonenumber = success.phonenumber AND phonecalls.Date < success.firstsuccess
GROUP BY phonecalls.CusID, phonecalls.phonenumber, success.firstsuccess;

I've not tested it...

Note: users which have not established a successfull call are not listed. Is this ok, or do you need them listed as well? If so, you need to "left join":

    SELECT phonecalls.CusID, COUNT(0) AS failedcalls, phonenumber, success.firstsuccess FROM phonecalls LEFT JOIN 
(SELECT min(Date) AS firstsuccess, CusID, phonenumber FROM phonecalls WHERE Duration IS NOT NULL GROUP BY CusID, phonenumber) success ON 
phonecalls.CusID = success.CusID AND phonecalls.phonenumber = success.phonenumber AND phonecalls.Date < success.firstsuccess
GROUP BY phonecalls.CusID, phonecalls.phonenumber, success.firstsuccess;



回答3:


In SQL Server 2012+, you can use the following logic:

  • Assign the number of "unanswered" calls to each row in the data. This uses conditional aggregation with a window function.
  • Then, take the maximum of the count for answered calls for each user.
  • Count the number of answered calls.
  • The ratio is the average.
  • This ignores strings of unanswered calls not followed by an answered call.

The resulting query:

select phone, max(cume_unanswered), count(*) as num_answered,
       max(cume_unanswered) * 1.0 / count(*) as ratio
from (select t.*,
             sum(case when duration is null then 1 else 0 end) over (partition by phone order by date) as cume_unanswered
      from t
     ) t
where duration is not null
group by phone;


来源:https://stackoverflow.com/questions/39551595/sql-count-sum-the-number-of-calls-until-a-specific-date-in-another-column

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!