从SQL收集连续信息

时间:2013-01-04 16:45:03

标签: sql sybase

我正在使用sybase。

我有一个包含时间和数量的列的表。数量可以是零或非零。我需要找到所有情况,其中任何时间内任何后续数量在1秒内> 0和原始数量大于40。

我无法在SQL结构方面考虑这个问题,但如果它是C ++代码,我可以使用for循环等轻松完成它。

让我试着用一个例子解释一下。

从附加图像中我按升序时间收集数据:

  • 因为数量为10.01.01.000> 40和10.01.01.001> 0我们在短名单中包含10.01.01.000

  • 我们的短名单中不包括10.01.01.001,即使数量> 0 1秒内的下一个数量,即10.01.01.002为0

  • 我们的样本中不包含第4行,因为即使在1秒内也有下一个

RowNumber   Time        Quantity

1        10:01:01.000     100

2        10:01.01.001     50

3        10:01:01.002      0

4        10:01.01.003    100

5        10:01:03.001    100

1 个答案:

答案 0 :(得分:4)

假设“next”你的意思是下一个并且没有多个记录,那么你可以用lead来完成。

select t.RowNumber, t.Time, t.Quantity
from (select t.*,
             lead(time, 1) over (order by time) as nextTime,
             lead(quantity, 1) over (order by time) as nextQuantity
      from t
     ) t
where datediff(ms, t.time. t.nexttime) <= 1000 and
      (t.Quantity > 40 and t.nextQuantity > 0)

如果您没有lead()功能,可以执行以下操作:

select t.RowNumber, t.Time, t.Quantity
from (select t.*,
             (select min(time) from t t2 where t2.time > t.time) as nexttime
      from t
     ) left outer join
     t tnext
     on tnext.time = t.nexttime
where datediff(ms, t.time. tnext.time) <= 1000 and
      (t.Quantity > 40 and tnext.Quantity > 0)