Рассчитайте самое быстрое время 5000 м для всей трассы - PullRequest
1 голос
/ 08 июня 2019

У меня есть велокомпьютер, регистрирующий каждую секунду, как далеко я зашел

Упрощенная версия данных выглядит так:

 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 м для всей трассы

Итак, я хочу рассчитать время для последних 5000 метров для каждой записи после 5000 м пробега

1 Ответ

2 голосов
/ 08 июня 2019

Одна проблема, с которой вы столкнулись, состоит в том, что разница никогда не бывает точно 5000 метров. Одно из приближений - получить первое значение за пределами 5000 метров и использовать его для расчета:

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 метрам и так далее. Это, вероятно, достаточно хорошо, поэтому я остановлюсь здесь.

На самом деле интерполяция первого и последнего этапов для получения точного результата возможна, но для очень небольшого улучшения потребуется много усилий.

...