1

各イベントの開始時刻と期間のみがある場合、同時イベントの分析を考え出す必要があります。

詳細

私は標準の CDR 通話詳細レコードを持っています。これには次のものが含まれます。

  • calldate (各通話開始の日時
  • duration (整数、通話時間の秒数)
  • チャネル (文字列)

私が考え出す必要があるのは、特定の日時期間における、毎秒の同時呼び出しのある種の分析です。たとえば、昨日の同時通話のグラフ。

(問題は、Web サイトの訪問者ログに期間があり、Web ページのグループの同時クライアントを取得したい場合と同じです)

あなたのアルゴリズムは何ですか?

指定された期間内のレコードを繰り返し処理し、配列を埋めることができます。配列の各バケットは、期間全体の 1 秒に対応します。これは機能し、高速に見えますが、期間が長い場合 (たとえば..1 年)、大量のメモリ (3600x24x365x4 バイト ~ 約 120MB) が必要になります。

これは Web ベースの対話型アプリ用であるため、メモリ フットプリントは十分に小さいはずです。

編集

同時とは、特定の秒のすべての呼び出しを意味します。2番目は私の最小単位です。1 時間中のすべての通話を同時に保留する必要がないため、より大きなもの (たとえば時間) を使用することはできません。

4

4 に答える 4

1

これをデータベースに実装します。DATEPART で GROUP BY 句を使用すると、任意の期間 (秒、分、時間など) の同時呼び出しのリストを取得できます。

Web 側では、クエリによって返されるヒストグラムを表示するだけで済みます。

于 2008-09-08T20:40:09.997 に答える
0

'simultaneous_calls'次の3つのフィールドを持つテーブルを作成できます。

yyyymmdd  Char(8),
day_second Number,  -- second of the day,
count          Number   -- count of simultaneous calls
Webサービスは、このテーブルから「カウント」値を取得して、いくつかの統計を作成できます。

Simultaneous_callsテーブルは、1日の終わりの後に毎日開始されるバッチプログラムによって埋められます。

Oracleを使用していると仮定すると、バッチは次のことを行うPL/SQLプロシージャを開始する可能性があります。

  1. 1日の1秒ごとに24*3600 = 86400レコードのテーブルを追加し、デフォルトの「カウント」値は0です。
  2. クエリの「day_cdrs」カーソルを定義します。

Select to_char(calldate, 'yyyymmdd')              yyyymmdd,
         (calldate - trunc(calldate)) * 24 * 3600   starting_second,
         duration                                              duration
From cdrs
Where cdrs.calldate >= Trunc(Sysdate -1)
    And cdrs.calldate 
  1. Iterates the cursor to increment 'count' field for the seconds of the call:
For cdr in day_cdrs
Loop 
   Update simultaneos_calls
   Set      count = count + 1
   Where yyyymmdd = cdr.yyyymmdd
       And day_second Between cdr.starting_second And cdr.starting_second + cdr.duration;
End Loop;
于 2008-10-04T17:18:16.203 に答える
0

@eric-z-beard: データベースにこれを実装できるようになりたいです。私はあなたの提案が好きで、何かにつながるように見えますが、完全には理解できません. 詳しく教えていただけますか?各呼び出しは数秒にまたがり、1 秒ごとにカウントする必要があることを思い出してください。DATEPART (または MySQL でそれに類するもの) を使用する場合、GROUP BY には何秒を使用する必要がありますか。同時性に関する注意を参照してください。

これについて詳しく調べたところ、一時テーブルを使用して解決する方法が見つかりました。temp が tStart から tEnd までのすべての秒を保持すると仮定すると、私は行うことができます

SELECT temp.second, count(call.id)
FROM call, temp
WHERE temp.second between (call.start and call.start + call.duration)
GROUP BY temp.second

次に、提案されているように、Web アプリはこれをヒストグラムとして使用する必要があります。

于 2008-09-10T02:22:15.143 に答える
0

このような多くの SQL トリックには、静的 Numbers テーブルを使用できます。Numbers テーブルには、10000 のように、n に対して 0 から n までの整数が含まれているだけです。

次に、一時テーブルを作成する必要はなく、代わりに次のようなサブクエリです。

SELECT StartTime + Numbers.Number AS Second
FROM Numbers
于 2008-10-04T00:03:17.073 に答える