我有一个数据库,其中包含一个记录表,用于存储一系列临时事务和已完成事务之间的时间戳。
它以一种非常奇怪的方式存储在数据库中,这给我带来了问题。
让我们以接力赛为例。这就是数据的记录方式。
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
“时间”表示接力棒传递以及最后一名选手完成比赛的时间。
因此,单个运行者的时间背后的数学是:
时间(Runner_n) = 时间(Runner_n+1) - 时间(Runner_n)
除了完赛选手外,没有 n+1 记录。他们得到:
时间(Runner_final)= 完成时间 - 时间(最终)
我打算尝试创建一个新表并使用游标迭代每场比赛 - 尝试存储以下元组:Race、RunnerID、TimeCompleted。
最佳答案
这根本不需要动态 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
关于sql - 通过递归计算接力赛时间(在动态 SQL 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16045068/