繁体   English   中英

来自MySQL的星号并发调用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM