[英]Asterisk Concurrent Calls from MySQL
我正在尝试从CDR获取并发调用,以通过MySQL查询报告星号。 我看到了其他建议,其中包括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
我想找出计费部门的最大并发呼叫数:
帐单部的DID:
1212111111
1212333333
所以上面将输出:
最多同时通话:3
我正在尝试使用MySQL和PHP来执行此操作,因此格式设置和所有这些在网页端均无关。 我只需要从MySQL查询中获取3。
我当前的尝试将返回5,因为它们都发生在第一个通话的开始和结束时间之内。
我目前看到的唯一方法是用每行的内部循环遍历每行,看看它是否发生在外部循环中,如果超过则增加最大并发。
有什么想法吗?
谢谢,
--E
如果您有权访问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";
?>
没有简单的方法可以做到这一点。
最简单的方法是执行以下操作:
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
但是此查询将非常非常不好地优化。
优化:为每个内部查询添加调用日期限制
您可以使用php来做。 只需按calldate整理所有查询,然后将相同的set设置为stopdate = calldate + duration。 将此类记录标记为最终记录。
两组都排序之后,通过结果循环。 当您看到开始记录时,请执行+1。 当您看到停止记录时,请检查当前值是否大于max(如果是,则设置max = c)并减少计数。
或使用pl-sql执行相同操作。 这个变体非常快,将会更快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.