2

一連の中間トランザクションと完了したトランザクションの間のタイムスタンプを格納するレコードのテーブルを持つデータベースがあります。

データベースに非常に奇妙な方法で保存されているため、問題が発生しています。

これを駅伝で例えてみましょう。このようにデータが記録されます。

RACE         TIME                             RUNNER    FINISHTIME
 1      2011-09-28 11:27:01.437        1                2011-09-28 17:19:00.843
 1      2011-09-28 12:35:33.427        2                2011-09-28 17:19:00.843
 1      2011-09-28 12:36:15.270        3                2011-09-28 17:19:00.843

「時間」は、バトンが渡され、最後のランナーが終了した時間を示します。

したがって、個々のランナーの時間の背後にある計算は次のとおりです:
Time(Runner_n) = Time(Runner_n+1) - Time (Runner_n)

n+1 が記録されていないフィニッシュランナーを除く。彼らは得る:
Time(Runner_final) = FinishTime - Time(final)

新しいテーブルを作成し、カーソルを使用して各レースを反復処理して、Race、RunnerID、TimeCompleted のタプルを保存しようとしました。

4

1 に答える 1

2

これには動的 SQL はまったく必要なく、結合だけが必要です。次のレコードに参加します。存在する場合は、そのレコードの時間を使用します。それ以外の場合は、レースの終了時間を使用します。

select t.race, t.runner, t.time as starttime,
       coalesce(tnext.time, t.finishtime) as endtime,
       DATEDIFF(sec, t.time, coalesce(tnext.time, t.finishtime)) as Seconds
from t left outer join
     t tnext
     on t.race = tnext.race and
        t.runner = tnext.runner - 1
于 2013-04-16T19:40:00.470 に答える