3

StartDate、EndDate、TimeRange の 3 つのパラメーターを使用するプロシージャーを作成しました。TimeRange によると、私の手順は日付を分割し、それらを別々にカウントします。これが私の手順です:

PROCEDURE [dbo].[Procedure1] 

    @Start datetime, 
    @Finish datetime,
    @TimeRange time
AS
BEGIN

    SET NOCOUNT ON;

    declare @TimeRanges as TABLE (SessionStart datetime, SessionEnd datetime);

     with TimeRanges as (
  select @Start as StartTime, @Start + @TimeRange as EndTime
  union all
  select StartTime + @TimeRange, EndTime + @TimeRange
    from TimeRanges
    where EndTime  < @Finish )
  select StartTime, EndTime, Count( Test.ScenarioID ) as TotalInboundArrivals
    from TimeRanges as TR left outer join
      dbo.Test as Test on TR.StartTime <= Test.SessionStartTime and Test.SessionCloseTime < TR.EndTime
    where Test.ScenarioID = 24  
    group by TR.StartTime, TR.EndTime   
END

例えば、

Start Time: 11:00
End Time: 12:00
TimeRange : 05:00

This procudure splits them like
     TimeRange    TotalCallPeaks
    11:00 11:05      12
    11:05 11:10      8
    11:10 11:15      15 
    etc..

これが私の質問です。同時に発生する最大の呼び出しが必要です。つまり、コール ピークが必要です。どんな提案や手がかりも私にとってとても役に立ちます。

ここに画像の説明を入力 この時間範囲で 6 件の呼び出しが発生しましたが、そのうちの 4 件は同時に発生したため、計算したいと考えています。最大ポイントは、最大コール ピークを示します。5 番目と 6 番目のコールはこの時間範囲で発生しますが、最大コール ピークには影響しません。

4

2 に答える 2

0

これは O(n log n) アルゴリズムである必要があります。

  1. すべてのレコードを #temp テーブルにダンプします
  2. 時間範囲を 2 つに分割し、クエリを実行して、どちらの時間範囲に多くの呼び出しがあるかを確認します
    • 残りの半分に該当するレコードを削除する
    • コール数が両方の半分で同じ場合、両方の半分を保持して処理します。これにより、作業セットが 2 から 4 などに増加する可能性がありますが、他のものと同じカウントを生成できない「半分」のために再び低下する可能性があります
    • 両方の半分に同じレコードが含まれている場合: このブランチは完了としてマークできます。通話は時間範囲全体で同時に行われます。「1 つの回答」についてここで停止する (確定済みとしてマークする) か、「すべての回答」を検索し続けることができます。

これを処理できる SP のドラフト構造:

表: #WorkingSets

  • パーティション (整数) : 最初は左/右、次に LLL/LLR/RLR など
  • session_id : これは複数のパーティションに同時に表示される可能性があります
  • session_start
  • セッション終了
  • curr_range_start
  • curr_range_end : start/end の間の範囲を半分に保ちます
  • ファイナライズ済み (ビット)

変数

  • @max_calls_per_partition : 「ファイナライズされた」セットが見つかるとロックされます
于 2012-10-23T09:25:30.767 に答える
0

同様のクエリを実行するために私が行ったことは、数値の補助テーブル (たとえば、100 万から 100 万の数値を持つテーブル) を使用することです。

クエリをパズルのように見てください。まず、開始時刻と終了時刻があるとします。

12:00PM~2:00PM

それを数字の表に交差結合すると、次のようになります

1; 12:00pm; 2:00pm
2; 12:00pm; 2:00pm
3; 12:00pm; 2:00pm
4; 12:00pm; 2:00pm
etc...

次に、補助数に必要な間隔を掛けます。たとえば、10 とします。

10; 12:00pm; 2:00pm
20; 12:00pm; 2:00pm
30; 12:00pm; 2:00pm
40; 12:00pm; 2:00pm
etc...

次に、計算された数値を開始時刻に追加します (これが間隔単位の場合は分単位)。DATEADD 関数を使用します。

10; 12:00pm; 2:00pm; 12:10
20; 12:00pm; 2:00pm; 12:20
30; 12:00pm; 2:00pm; 12:30
40; 12:00pm; 2:00pm; 12:40
etc...

where句または選択した範囲による内部結合、クロス適用などを使用して、開始時間と終了時間の間にある計算された時間間隔のみを取得します...

次に、「t1」が上記の結果セットから派生したテーブルになったとします。行ごとに、その時点でアクティブだったコールの数を選択します。これは次のようになります。

select * FROM t1 cross apply (select sum(1) numcalls from yourtable t2 where t1.calculatedtimeinterval between t2.startdatetime and t2.enddatetime ) t3

勝つ!

于 2012-11-14T18:03:07.163 に答える