MySQL的星号并发调用

时间:2017-01-15 17:45:50

标签: mysql concurrency asterisk

我试图通过MySQL查询从我的CDR获取星号报告的并发调用。我已经看到了其他建议,它们包括JOIN和ON以及其他一些我没有完全理解他们正在做什么的调用,所以我无法调整我的应用程序。

我有多个部门都有自己的DID,我需要个人报告。我当前的脚本是错误的,因为它抓取了正在进行呼叫时发生的呼叫数量,这意味着如果呼叫从下午1点到下午2点连接,它将计算在下午1点到2点之间发生的所有后续呼叫,这不是我的想。我想要并发呼叫的数量,而不是发生了多少次呼叫。

我的数据集

calldate            | callsource  | calldestination | duration | callended
--------------------| ------------| ----------------| -------- | ---------
2016-12-01 15:45:00 | 12121111111 | 12031234567     | 120      | 2016-12-01 15:47:00          
--------------------| ------------| ----------------| -------- | ---------
2016-12-01 15:45:10 | 12122332223 | 12121111111     |  15      | 2016-12-01 15:45:25 
--------------------| ------------| ----------------| -------- | ---------
2016-12-01 15:45:12 | 12121111111 | 12033254678     | 15       | 2016-12-01 15:45:27 
--------------------| ------------| ----------------| -------- | ---------
2016-12-01 15:45:20 | 12123333333 | 12031223244     | 50       | 2016-12-01 15:47:10 
--------------------| ------------| ----------------| -------- | ---------
2016-12-01 15:45:26 | 12121111111 | 12031231222     | 10       | 2016-12-01 15:45:33 
--------------------|-------------|-----------------|----------|----------
2016-12-01 15:45:27 | 12120433322 | 12031456544     | 10       | 2016-12-01 15:45:37 

我想找出结算部门的最大并发呼叫:

Billing Department的DID:
1212111111个
1212333333个

所以上面会输出:
最大并发呼叫:3

我正在尝试使用MySQL和PHP这样做,因此格式化和所有在网页端都无关紧要。我只需要从MySQL查询中获取3个。

我的当前尝试将返回5,因为它们都发生在第一个呼叫的开始和结束时间内。

我目前看到这样做的唯一方法是遍历每一行的每一行,看看它是否在外循环期间发生,如果超过则增加最大并发数。

思想?

谢谢,
--e

2 个答案:

答案 0 :(得分:1)

如果您可以访问Asterisk CLI,那么您可以在Asterisk服务器控制台上激活一个命令,您将获得并发呼叫的数量:

asterisk -rx "core show calls" | grep "active" | cut -d' ' -f1

您可以在PHP脚本中使用此命令,例如:

<?php

$cmd = `asterisk -rx "core show calls" | grep "active" | cut -d' ' -f1`; //getting current active calls on asterisk server
echo "ConCurrentCalls:".$cmd."\n";

?>

答案 1 :(得分:0)

没有简单的办法。

最简单的方法就是做这样的事情:

select max(c) from 
 ( select a.uniqueid,a.calldata,
    (select count(*) from cdr as b
       where  
        b.calldate <date_add(a.calldate,interval a.duration second) and  
        date_add(b.calldate,interval  b.duration second) >a.calldate
    ) as c    
 from cdr as a ) as res 

但是这个查询将非常糟糕地进行优化。

优化:  为每个内部查询添加calldate限制

你可以使用php。只需通过calldate对所有查询进行排序,然后将相同的set与stopdate = calldate + duration放在一起。将此类记录标记为结束记录。

在两次设置之后,通过结果循环。当您看到开始记录时,请执行+1。当您看到停止记录时,检查当前值是否> max(如果是,设置max = c)并减少计数。

或者使用pl-sql做同样的事情。非常喜欢这个变种会更快。