超速的细节

时间:2017-09-29 01:56:31

标签: sql tsql

我有T-SQL的问题,我不知道如何解决它,如果你能帮助我,我将非常感激。


日期标识速度
17年1月2日:01:00 PTWE23 23
17年1月2日:01:10 PTWE23 25
17年1月2日:01:20 PTWE23 31
17年1月2日:01:30 PTWE23 41
17年1月2日:01:40 PTWE23 43
17年1月2日:01:50 PTWE23 34
17年1月2日:02:00 PTWE23 16
17年1月2日:02:10 PTWE23 3
17年2月2日:02:20 PTWE23 11
17年2月2日:02:30 PTWE23 35
17年2月2日:02:40 PTWE23 42
17年2月2日:02:50 PTWE23 46
17年2月2日:03:00 PTWE23 41
17年2月2日:03:10 PTWE23 21
17年2月2日:03:20 PTWE23 10
17年2月2日:03:30 PTWE23 0
17年2月2日:04:20 AABB01 30
17年2月2日:04:30 AABB01 38
17年2月2日:04:40 AABB01 45
17年2月2日:04:50 AABB01 50
17年2月2日:04:00 AABB01 52
17年2月2日:05:10 AABB01 43
17年2月2日:05:20 AABB01 41
17年2月2日:05:30 AABB01 33

我需要这样的视图

DateFrom DateTo Id超速(40公里/小时)
01-02-17:01:30 01-02-17:01:40 PTWE23 10秒
02-02-17:02:40 02-02-17:03:00 PTWE23 20秒
02-02-17:04:40 02-02-17:05:20 AABB01 40秒

感谢
帕特里西奥

1 个答案:

答案 0 :(得分:0)

目前尚不清楚您的标准是什么。对于您的数据,您可以按id和日期定义组。这是一个答案的尝试:

select min(date), max(date), id,
       sum(case when speed > 40 then 10 else 0 end) - 10 as overspeed
from t
group by id, cast(date as date);

以上产生了指定的结果。

但是,如果您正在寻找时间超过40的 islands ,那么您可以使用行数的差异:

select min(date), max(date), id, 
       datediff(second, min(date), max(date)) as num_seconds
from (select t.*,
             row_number() over (partition by id order by date) as seqnum_i,
             row_number() over (partition by id, (case when speed > 40 then 1 else 2 end)
                                order by id
                               ) as seqnum_is
      from t
     ) t
where speed > 40
group by id, (seqnum_i - seqnum_is);