Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 计算最快的50公里行程_Sql_Sql Server - Fatal编程技术网

Sql 计算最快的50公里行程

Sql 计算最快的50公里行程,sql,sql-server,Sql,Sql Server,嗨,我的自行车电脑上有这些速度数据: 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), ('2

嗨,我的自行车电脑上有这些速度数据:

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

您可以通过在cte中查找50公里后的第一行并将结果与最小值和最大值分组来完成此操作。然后我计算了最小值和最大值之间的秒差,并将其转换为时间数据类型。我假设每天只能骑一次,除非你是超人

  ;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)

你可以试试这个脚本。也许理解起来更简单。结果是所有长度为50 km的路段。查找字段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

我不明白你的数据。鉴于此数据集,您将如何手动执行此操作?此数据中的赛道是什么?您需要每场比赛的开始/结束时间,还是所有比赛都有固定的开始时间?然后用这个开始时间,你将数据中的所有时间进行比较,以获得它们的速度?前50公里的时间和目前为止最快的时间:“2018-07-26 08:36:08.0000000”-“2018-07-26 07:04:52.0000000”因此,在50000米后的每行1小时32分钟后,我想计算到50000米之前的时间距离。@JensBorrisholt。你有一个不规则的时间序列。这会很难,我会试试的。现在我有一些事情要处理。这是200公里旅行的一部分。所以我可能从1公里到51公里比2公里到52公里跑得更快。。。
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