2013-01-04 67 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