1

sybaseを使用しています。

時間と数量という名前の列を持つテーブルがあります。数量は、ゼロまたはゼロ以外のいずれかになります。1秒以内の後続の数量が>0で、元の数量が40より大きい場合をすべて見つける必要があります。

この問題はSQL構造の観点からは考えられませんが、C ++コードであれば、forループなどを使用して簡単に実行できたはずです。

これを例を挙げて説明してみましょう。

昇順でデータを収集した添付画像から:

  • 10.01.01.000>40および10.01.01.001>0の数量なので、ショートリストに10.01.01.000を含めます。

  • 数量>0の場合でも、1秒以内の次の数量(10.01.01.002)は0であるため、ショートリストに10.01.01.001は含まれません。

  • 行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 に答える