sql - 计算整个赛道最快的5000米时间
问题描述
我有一台自行车电脑,每秒记录我走了多远
数据的简化版本如下所示:
declare @DistanceTable Table
(
ID int,
Time DateTime2,
DistanceMeters float
)
insert into @DistanceTable values
(1, '2018-08-10 07:17:48', 3.8099999427795410),
(2, '2018-08-10 07:17:49', 7.7600002288818359),
(3, '2018-08-10 07:17:50', 12.3299999237060547),
(4, '2018-08-10 07:17:51', 18.0000000000000000),
(5, '2018-08-10 07:17:52', 24.8999996185302734),
(6, '2018-08-10 07:17:53', 32.1599998474121094),
(7, '2018-08-10 07:17:54', 40.7200012207031250),
(8, '2018-08-10 07:17:55', 49.7599983215332031),
(9, '2018-08-10 07:17:57', 68.6100006103515625),
(10, '2018-08-10 07:17:58', 79.3199996948242188),
(11, '2018-08-10 07:18:00', 100.1900024414062500),
(12, '2018-08-10 07:18:02', 122.7099990844726563),
(13, '2018-08-10 07:18:03', 134.1900024414062500),
(14, '2018-08-10 07:18:04', 145.9199981689453125),
(15, '2018-08-10 07:18:05', 158.4700012207031250),
(16, '2018-08-10 07:24:04', 5003.4101562500000000), --5000 meters driven
(17, '2018-08-10 07:24:05', 5018.7797851562500000),
(18, '2018-08-10 07:24:06', 5034.0498046875000000),
(19, '2018-08-10 07:24:07', 5048.8901367187500000),
(20, '2018-08-10 07:24:08', 5063.8798828125000000),
(21, '2018-08-10 07:24:09', 5079.0200195312500000),
(22, '2018-08-10 07:24:13', 5141.0600585937500000),
(23, '2018-08-10 07:24:17', 5201.7500000000000000),
(24, '2018-08-10 07:24:21', 5261.8798828125000000),
(25, '2018-08-10 07:24:23', 5290.2900390625000000),
(26, '2018-08-10 07:24:28', 5363.7099609375000000),
(27, '2018-08-10 07:24:33', 5435.9101562500000000),
(28, '2018-08-10 07:24:34', 5450.8901367187500000),
(29, '2018-08-10 07:24:35', 5465.4199218750000000),
(30, '2018-08-10 07:24:36', 5480.5400390625000000)
我正在尝试计算整个赛道的最快 5000 m 时间
所以我想计算驱动5000米后每条记录最后5000米的时间
解决方案
您遇到的一个问题是,差异永远不会恰好是5,000 米。一个近似值是获得超过 5,000 米的第一个值并将其用于计算:
select top (1) dt.*, dt2.distance, dt2.time,
(dt2.distance - dt.distance) as actual_distance,
datediff(second, dt.time, dt2.time) as actual_time,
(dt2.distance - dt.distance) / datediff(second, dt.time, dt2.time) as rate
from @DistanceTable dt cross apply
(select top (1) dt2.*
from @DistanceTable dt2
where dt2.distance >= dt.distance + 5000
order by dt2.distance asc
) dt2
order by rate desc;
您的数据点足够近,以至于实际总距离为 5,009 米、5,002 米等。这可能已经足够好了,所以我会在这里停下来。
实际上,插入第一条和最后一条腿以获得准确的结果是可能的,但对于非常小的改进来说,这将是一个很大的努力。
推荐阅读
- vb.net - 使用子字符串在字符串中拆分日期和时间
- ubuntu - 在 Ubuntu 上阻止 ASN 而不是 IP/CIDR
- jquery - 使用 .html() 未显示图标
- php - 如何使用 PHP 从 JSON 中获取最后 5 个数据?
- python - 如何从值为“No”而不是 NaN 的列中清除值?
- matlab - 在 Win10 上为 MATLAB 编译 SPAMS 工具箱时出现“未声明的 '_finite'”错误
- grails - Grails Spring Security Shiro,如何在无需注销重新登录的情况下刷新权限?
- julia - 如何计算我的主要代码的时间?
- android - How can I use Android expansion files using App Bundle?
- sql-server - 如何在不为表指定列名的情况下将动态数据透视的结果存储到临时表中?