SQL查询确定一个范围内的停止时间

标签 sql mysql database

I have to determine stopped time of an vehicle that sends back to server its status data every 30 second and this data is stored in a table of a database.

The fields of a status record consist of (vehicleID, ReceiveDate, ReceiveTime, Speed, Location).

Now what I want to do is, determine each suspension time at the point that vehicle speed came to zero to the status the vehicle move again and so on for next suspension time. For example on a given day, a given vehicle may have 10 stopped status and I must determine duration of each by a query.
The result can be like this:

id Recvdate    Rtime  Duration   
1  2010-05-01  8:30   45min  
1  2110-05-01  12:21  3hour 

最佳答案

这是windows函数(在Oracle中称为解析函数)的一个应用。

您的目标是为每个停靠点序列分配一个“区 block 编号”。也就是说,一个序列中的所有停靠站(对于车辆)将具有相同的街区编号,这将不同于所有其他停靠站序列。

这是分配 block 号的方法:

  1. 创建一个速度标志,当速度 > 0 时显示 1,当速度 = 0 时显示 0。
  2. 枚举速度标志 = 1 的所有记录。这些是“ block ”。
  3. 进行自连接以将每个标志 = 0 放入一个 block 中(这需要分组并采用最大块数)。
  4. 按持续时间或您想要的方式进行总结。

下面的代码是我的意思的草图。它不会解决你的问题,因为你不清楚如何处理日间休息,你想总结什么信息,并且它有一个off-by-1错误(在每个停止序列中它包括之前的不停,如果有的话)。

with vd as 
(
   select vd.*,
      (case when SpeedFlag = 1 
           then ROW_NUMBER() over (partition by id, SpeedFlag) end) as blocknum
   from 
   (
      select vd.*, (case when speed = 0 then 0 else 1 end) as SpeedFlag
      from vehicaldata vd
   ) vd
)
select id, blocknum, COUNT(*) as numrecs, SUM(duration) as duration
from 
(
   select vd.id, vd.rtime, vd.duration, MAX(vdprev.blocknum) as blocknum
   from vd 
   left outer join vd vdprev
     on vd.id = vdprev.id 
     and vd.rtime > vdprev.rtime
   group by vd.id, vd.rtime, vd.duration
) vd
group by id, blocknum

关于SQL查询确定一个范围内的停止时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2979306/

相关文章:

sql - 有用的常用 SQL 数据集?

sql - ActiveRecord 通过模型的数组属性查找包含一个值(不是关联数组)

python - 在 python 中执行用于在 SQL Management Studio 中运行的 .sql 文件

sql - 如何在access中按求和列排序?

python - 如何使用python获取所有存储在redis中的数据库

python - 应用程序启动后插入到 mysql 表中的行未被应用程序选取

ios - 我想将我的 mySQL 数据库连接到我的 xcode 项目

javascript - 使用javascript输出图像但不下载

mysql - 将多行合并为一行 Mysql

mysql - 结果集的子查询或条件逻辑