Рассчитайте самый быстрый 50 км езды - PullRequest
0 голосов
/ 06 июня 2019

Привет У меня есть данные о скорости от моего велокомпьютера:

declare @DistanceTable Table
(
  Time DateTime2,
  DistanceMeters float
)

insert into @DistanceTable   values 
    ('2018-07-26 07:04:52.0000000',  2.10999989509583),
    ('2018-07-26 07:04:53.0000000',  4.84999990463257),
    ('2018-07-26 07:04:54.0000000',  7.94000005722046),
    ('2018-07-26 07:04:55.0000000', 11.5600004196167),
    ('2018-07-26 07:04:56.0000000', 16.2700004577637),
    ('2018-07-26 07:04:57.0000000', 21.3199996948242),
    ('2018-07-26 07:04:58.0000000', 26.9099998474121),
    ('2018-07-26 07:04:59.0000000', 32.8899993896484),
    ('2018-07-26 07:05:00.0000000', 39),
    ('2018-07-26 07:05:01.0000000', 45.6500015258789),

...

('2018-07-26 08:36:08.0000000', 50003.19921875),
('2018-07-26 08:36:09.0000000', 50010.73046875),
('2018-07-26 08:36:10.0000000', 50018.328125),
('2018-07-26 08:36:11.0000000', 50025.9609375),
('2018-07-26 08:36:12.0000000', 50033.5703125),
('2018-07-26 08:36:13.0000000', 50041.2109375),
('2018-07-26 08:36:14.0000000', 50048.94140625),
('2018-07-26 08:36:15.0000000', 50056.7109375),
('2018-07-26 08:36:16.0000000', 50064.421875),
('2018-07-26 08:36:17.0000000', 50072.1484375)

И еще много данных.

Мой вопрос: как рассчитать самое быстрое время в 50 км на этой трассе.

Область применения: Sql Server 2017

Ответы [ 2 ]

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

Вы можете сделать это, найдя первый ряд через 50 км (в cte) и сгруппировав результаты с min() и max().Затем я вычислил разницу в секундах между min и max и преобразовал ее в тип данных time.Я предположил, что может быть только одна поездка в день, если вы не сверхчеловек ...

  ;with mostCloseTo50 as (
    select
         Time
        ,row_number() over (partition by cast(Time as date) order by DistanceMeters asc) as number
        ,DistanceMeters
    from @DistanceTable
    where DistanceMeters > 50000
)
select 
    cast(dateadd(SECOND,DATEDIFF(SECOND, min(d.Time), max(d.Time)),'00:00:00') as time(0))
from @DistanceTable as d
join mostCloseTo50 as m
    on cast(m.Time as date) = cast(d.Time as date)
    and m.number = 1
    and d.DistanceMeters <= m.DistanceMeters
group by cast(d.Time as date)

результат:

01:31:16
1 голос
/ 06 июня 2019

Вы можете попробовать этот скрипт.Может быть, это проще для понимания.Результатом являются все отрезки длиной 50 км.Найти мин для поля "TimeSegmentSec".

CREATE CLUSTERED INDEX IX_DistanceTable_DistanceMeters on #DistanceTable (DistanceMeters) 

Declare @Segment int=50000 -- 50 km
Select DT.DistanceMeters as 'Start',DT3.DistanceMeters as 'Finish',DT.Time as 'StartTime',DT3.Time as 'FinishTime'
    ,DATEDIFF(second,DT.Time,DT3.Time) 'TimeSegmentSec',DT3.DistanceMeters-DT.DistanceMeters 'LengthSegment'
from #DistanceTable DT
    cross apply 
    (Select Top 1 Time,DistanceMeters from #DistanceTable DT2 where DT2.DistanceMeters<=DT.DistanceMeters+@Segment order by DistanceMeters desc
    ) as DT3
where DT3.DistanceMeters-DT.DistanceMeters>@Segment-20 -- Exclude shorter segment
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...