2017-01-15 7 views
0

MySQLクエリ経由でアスタリスクレポートのために私のCDRからの同時呼び出しを取得しようとしています。私は他の提案を見て、彼らは私が自分のアプリケーションに合わせて調整することができなかったので、彼らが何をしているかを完全に理解していないJOINsとONsといくつかの他の呼び出しが含まれています。アスタリスクMySQLからの同時コール

個別のレポートが必要な独自の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:

したがって、上記の希望を出力:
最大同時実行件数:3

これをMySQLとPHPで実行しようとしています。そのため、書式設定はすべてWebページ側では関係ありません。私はちょうどMySQLのクエリの3を取得する必要があります。

私の現在の試行は、すべてが最初のコールの開始時間と終了時間内に発生したため、5を返します。

私が現在行っている唯一の方法は、すべての行の内側のループですべての行をループし、外側のループで発生したかどうかを確認し、

思考?簡単な方法はありません
--E

答えて

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 

をしかし、このクエリは、最適化された非常に非常に悪いになります。

最適化: PHPを使用して行うことができ、各内部クエリ

ためcalldate制限を追加します。 calldateですべてのクエリを並べ替え、その後同じセットをstopdate = calldate + durationで置き換えます。そのようなレコードを終了レコードとしてマークする。

このソートの両方を行った後、結果としてループします。開始記録が見えたら、+1をしてください。停止記録が表示されたら、現在の値> max(yesの場合はmax = cを設定)とcountを減らしてください。

また、同じようにpl-sqlを使用してください。この1つの亜種は、非常に好きなほどずっと速くなります。

+0

私はこのロジックに従います。 – eherr9633

+0

すべてのレコードを確認してください。各レコードについて、このレコードの開始と終了の間に開始するすべてのレコードをチェックします(このレコードの終了後、LESSコールを取得するので、最大値はレコード内にある必要があります)。 – arheops

1

アスタリスク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"; 

?> 
+0

私はこれに同意し、私は実際に毎時ベンチマークしているときにこのコマンドを使用します。しかし、これは、私が部署の使用状況を判断しようとしているときに役立ちません。私は毎日最大の同時通話を特定の番号との間でやり取りしようとしています – eherr9633

関連する問題