sql - 通过递归计算接力赛时间(在动态 SQL 中)

标签 sql t-sql dynamic-sql

我有一个数据库,其中包含一个记录表,用于存储一系列临时事务和已完成事务之间的时间戳。

它以一种非常奇怪的方式存储在数据库中,这给我带来了问题。

让我们以接力赛为例。这就是数据的记录方式。

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/

相关文章:

sql - 使用 BULK INSERT 映射列

sql - 使用嵌套查询加速 SQL 查询

sql-server - T-SQL 选择重复行之间的行

function - 使用动态 sql 返回多个结果(postgresql 8.2)

sql - 如何在 PostgreSQL 中对表进行逆透视

带内连接的 Mysql 查询

c# - 在 SQL 和 C# 中连接来自不同数据库、服务器的表

php - 尝试将 MySQL 表名称回显到 HTML 页面中

选择查询中的 SQL 计数

oracle - PostgreSQL 中是否有与 ORACLE DBMS_SQL 等效的东西?