我试图通过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
答案 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做同样的事情。非常喜欢这个变种会更快。