2

over 関数を使用して、すべての行の現在の行の開始日と終了日の間に開始するイベントの数をカウントしようとしています。つまり、同時カウンターです。最終的には、1 日または 1 時間あたりの最大同時イベント数などを探します。

select   FingerPrint
        ,StartDate
        ,EndDate
        ,Num_ConCurrent =   count(FingerPrint) over (
                                                    partition by StartDate
                                                    order by StartDate  
                                                    range between StartDate PRECEDING and EndDate following 
        )
from    #File
group by     FingerPrint
            ,StartDate
            ,Enddate

残念ながら、これはうまくいかないようです。単純に自己結合を使用できることはわかっていますが、over 句を使用した別の方法があるのではないかと考えました。

どんな助けでも大歓迎です。

注意: エラーメッセージ

メッセージ 102、レベル 15、状態 1、行 7 'StartDate' 付近の構文が正しくありません。

4

1 に答える 1

0

over 句の Range パラメータは、列参照ではなく、整数値を探しています。over句でそれを行う方法があるかもしれませんが、私もそれを機能させることができませんでした。

私の経験では、範囲内の日付への自己結合は非常に遅く、高速化するための適切なインデックスのセットが見つかりませんでした。この場合、インライン サブクエリで使用するだけです。

select  FingerPrint,
        StartDate,
        EndDate,
        (select count(FingerPrint)
         from #File F2
         where F2.StartDate between F.StartDate and F.EndDate
        ) 
        as Num_ConCurrent 
        )
from    #File F

私が持っているいくつかの予定データに対していくつかのテストを実行し、この方法を使用して32,000行の予定を即座に実行しました。自己参加は、停止する前に 15 秒間実行されました。

于 2013-03-12T18:42:10.743 に答える