0

私は仕事でこの問題を解決しようとして最も苦労しています。正直に質問する方法すらわかりません。同じ時間に発生した呼び出しのピーク数を取得したいと思います。

日付範囲を分に分割して(結果として膨大なデータセットになります)、これらの時間中に発生した呼び出しのカウントを取得してみましたが、呼び出しの総数がわかっているため、カウントはオフになりました(10倍オフになりました)。 。

1 | 2012-01-01 01:15:00.000 | 2012-01-01 01:16:00.000
2 | 2012-01-01 01:14:00.000 | 2012-01-01 01:17:00.000
3 | 2012-01-01 01:18:00.000 | 2012-01-01 01:20:00.000

最初のコールの日時範囲中に、2つのコールが発生しました(それ自体と番号2)。2と同じです。コール3その日時の範囲内にコールは発生しませんでした。1日の日時の範囲について話しているので、これはかなり単純化されています。これは、数分または数秒の範囲である可能性があります。月ごとのピークを見つける必要があります。したがって、この例では、1月のピークは2になります(数値を決定した日付範囲を知る必要はありません)

4

1 に答える 1

1

これが私の好みの方法です。通話が開始または停止するすべての時間のリストから始まり、同時通話の数を計算します。

with t as (
     select starttime as thetime, 1 as isstart, 0 as isend
     from calls
     union all
     select endtime, 0 as isstart, 1 as issend
     from calls
   ),
   t2 as (
     select thetime, row_number() over (order by thetime) as numcalls,
            isstart, isend,
            row_number() over (partition by isstart order by thetime) as cumstartsorends
     from t
    ),
   t3 as (
     select thetime,
            (case when isstart = 1 then cumstartsorends
                  else numcalls - cumstartsorends
             end) as numstarts,
            (case when isend = 1 then cumstartsorends
                  else numcalls - cumstartsorends
             end) as numends
      from t2
     )
select year(thetime) as yr, month(thetime) as mon,
       max(numstarts - numends) as maxcum
from t3
group by year(thetime), month(thetime)

このクエリが本当に実行したいのは、各時間(開始時間または終了時間)の累積合計です。ただし、これは2012年までサポートされていません。

だから、それはトリックを行います。開始と停止の累積数を計算します。ただし、これらは開始時間または終了時間のレコードにのみ存在します。他の値を取得するために、開始と停止の合計も計算し、この値を減算します。したがって、各タイムスタンプには、開始と停止の累積数があります。違いは、同時呼び出しの数です。

于 2012-09-14T21:00:14.310 に答える