2014-11-15 2 views
1

증가하지 않는 행이 같은 열이있는 테이블이를 찾을 수 있습니다. SQL은 값이

는이 같은 성명 시도 :

SELECT count(a.id) 
FROM tbl AS a INNER JOIN tbl AS b ON a.id+1=b.id 
WHERE a.timestamp<b.timestamp; 

을하지만 일을해야하지 나타납니다. 내가 약간을 기대하더라도 나는 결과를 얻지 못한다. 어떤 제안이 잘못 되었나요?

나는이 쿼리를 작성하는 더 좋은 방법에 대한 아이디어를 얻었습니다.

저는 MySQL을 사용하고 있습니다.

답변

2

당신은 상관 하위 쿼리를 사용하여 이전 값을 얻을하고 비교를 위해 그것을 사용할 수 있습니다

select t.* 
from (select t.*, 
      (select t2.timestamp from tbl t2 where t2.id < t.id order by t2.id desc limit 1 
      ) as prevts 
     from tbl t 
    ) t 
where timestamp < prevts; 

쿼리의 문제는 아마 인 IDS 그들에 틈이 있는지 확인하십시오.

편집 :

변수를 사용하여이를 수행 할 수 있습니다. 하나의 표현식에서 변수 비교 및 ​​할당을 얻는 것이 과제입니다. 이것은 MySQL이 select 문에서 표현식의 평가 순서를 보장하지 않기 때문에 필요합니다.

다음은 IsDecreasing에 값을 할당하고 값을 할당합니다

select t.* 
from (select t.*, 
      if(@prev > timestamp, if(@prev := timestamp, 1, 1), 
       if(@prev := timestamp, 0, 0) 
       ) IsDecreasing 
     from tbl t cross join 
      (select @prev := -1) vars 
     order by id 
    ) t 
where IsDecreasing = 1; 

이 이전 방법보다 더 빨리해야한다 - 아마 당신이 바로 인덱스가있을 때.

+0

사실입니다. id에는 예상치 못한 차이가 있습니다. 귀하의 방법은 훨씬 느리게 실행되고 있지만 더 견고 해 보입니다. – chowey

+0

성능을 위해'tbl (id, timestamp)'에 색인을 추가하십시오. –