2013-01-04 2 views
1

sybase를 사용 중입니다.SQL에서 연속 된 정보 수집

시간 및 수량이라는 열이있는 테이블이 있습니다. 수량은 0 또는 0이 될 수 있습니다. 나는 언제든지 1 초 내에 연속되는 양이> 0이고 원래 양이 40보다 큰 모든 경우를 찾아야한다.

이 문제는 SQL 구조로는 생각할 수 없지만 C++ 코드 for 루프를 사용하면 쉽게 할 수 있습니다.

예를 들어 설명해 드리겠습니다. I는 상승 시간에서 데이터를 수집 한 이미지 첨부

:

  • 우리 쇼트리스트에 포함 10.01.01.000 10.01.01.000> 40 10.01.01.001> 0 주문 이후

  • 우리는 양이> 0, 즉 10.01.01.002에서 일초 이내에 다음 양이 아니라하더라도 우리의 단락 목록에 10.01.01.001에 포함되지 않습니다 다음이 같은 행 사 우리의 샘플에 포함되지 않습니다 0

  • 심지어 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이 작업을 수행 할 수 있습니다. 당신이 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) 

, 당신은이 작업을 수행 할 수 있습니다

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