我正在使用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
答案 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)