2013-01-04 65 views
1

我正在使用sybase。从SQL中收集连续信息

我有一个列名为时间和数量的表。数量可以是零或非零。我需要找到所有的情况,其中任何时间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,即在10.01.01.002在1秒内的下一个数量为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 

回答

4

通过假设“下一步”你真的是下一个,有没有多条记录,那么你就可以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) 
+0

十分感谢!我从来没有使用铅,但我现在可以看到它的使用。如果我还有一个类别列,其中上面的数据是用于类别名称为'A'的类别列表,并且我们有类似的数据用于类别名称为'B'等等,那么如何修改上面的代码。我们希望为每个类别找到相关的样本。 – Zanam

+0

你可以在'over':'over(按时间分类按类别排序)'后修改语句。 –

+0

谢谢!会给你一个尝试的建议。 – Zanam