1

我正在使用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 时间数量

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

1 回答 1

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)
于 2013-01-04T16:55:13.360 回答