0

口実:

現在、お客様のために詳細で正確な通話統計を作成しようとしています。以前は、Asterisk は通話の詳細を通話ごとに 1 行に保存していました。呼び出しで発生する可能性のあるすべてのことを格納するには、1 つの行では不十分であり、データが誤解を招くか間違っていることがよくあります。呼び出しのイベントごとに 1 つの行を格納する新しいテーブル形式になりました。このテーブルには、大規模な顧客の数百万のレコードが簡単に含まれます。

200k レコードしかないテスト サーバーでこのテーブルから直接選択しようとしましたが、より高度なクエリでは時間がかかりすぎてしまいました。要約テーブルを作成することにしました (そのため、呼び出しごとに 1 行に戻りますが、より詳細な情報が利用できるようになりました)。このデータを使ってやりたいことはたくさんありますが、この「単純な」問題を解決できれば、他のすべての問題も解決できると確信しています。

問題:

フィールドlinkedidは、1回の呼び出しですべての行で同じです。フィールド eventtype には、1 つの linkedid に対して同じイベントが 0 回、1 回、または複数回発生する可能性があります。

要約テーブルにいくつかのデータを入力します。

INSERT INTO astcel_summary
(linkedid, starttime, endtime, callfrom, callto, direction)
SELECT 
linkedid, MIN(eventtime), MAX(eventtime), cid_num, exten, IF ((context = 'from-extension'), 1, 0)
FROM astcel
GROUP BY linkedid;

BRIDGE_START イベントは、人が通話に応答したことを示すため、特に重要です。通話に応答がない、応答がない、または複数回 (転送、会議) 応答することさえあります。各呼び出しの最初の(もしあれば) BRIDGE_START イベントからのいくつかのフィールドでサマリー テーブルを更新したいと考えています。

次のように、一度に 1 つのフィールドを更新できました。

UPDATE astcel_summary, astcel
SET astcel_summary.answertime = 
(
SELECT eventtime
FROM astcel
WHERE astcel.linkedid = astcel_summary.linkedid
AND astcel.eventtype = 'BRIDGE_START'
GROUP BY astcel.linkedid
)
WHERE astcel.linkedid = astcel_summary.linkedid
AND astcel.eventtype = 'BRIDGE_START';

複数のフィールドを更新するために、さまざまな結合とサブクエリを使用してさまざまなバリエーションを試しましたが、うまくいきません。この操作も何らかの方法で元のインサートとマージできれば、それは素晴らしいことです.

集計テーブルを使用せず、時間もかかりすぎずに選択する方法がさらに良いでしょう。たとえば、次のようになります。 先月の営業時間中に発信者が応答するまでに待機した平均時間 (および他のいくつかの同様のデータ) を数字でグループ化したもの呼ばれた。

4

0 に答える 0