본문 바로가기
MySql

MySQL SQL : 이전 행에서 열 값이 변경된 행 선택

by 베이스 공부 2020. 10. 4.
반응형

타임 스탬프를 늘려 정렬 된이 (MySQL) 데이터베이스가 있다고 가정 해 보겠습니다.

Timestamp   System StatusA StatusB 
2011-01-01     A      Ok     Ok      
2011-01-02     B      Ok     Ok     
2011-01-03     A     Fail   Fail     
2011-01-04     B      Ok    Fail     
2011-01-05     A     Fail    Ok      
2011-01-06     A      Ok     Ok      
2011-01-07     B     Fail   Fail    

해당 시스템의 이전 행에서 StatusA가 변경된 행을 어떻게 선택합니까? StatusB는 중요하지 않습니다 (이 질문에서는 StatusA가 변경되지 않는 각 시스템에 대해 많은 연속 행이있을 수 있음을 설명하기 위해이 질문에 표시합니다). 위의 예에서 쿼리는 2011-01-03 행 (SystemA의 경우 2011-01-01과 2011-01-03 사이에 변경된 StatusA), 2011-01-06, 2011-01-07을 반환해야합니다.

쿼리는 수만 개의 레코드가있는 테이블에서 빠르게 실행되어야합니다.

감사

 

해결 방법

 

SELECT a.*
FROM tableX AS a
WHERE a.StatusA <>
      ( SELECT b.StatusA
        FROM tableX AS b
        WHERE a.System = b.System
          AND a.Timestamp > b.Timestamp
        ORDER BY b.Timestamp DESC
        LIMIT 1
      ) 

그러나 (System, Timestamp) 에 대한 색인을 사용하여 시도해 볼 수도 있습니다.

SELECT System, Timestamp, StatusA, StatusB
FROM
  ( SELECT (@statusPre <> statusA AND @systemPre=System) AS statusChanged
         , System, Timestamp, StatusA, StatusB
         , @statusPre := StatusA
         , @systemPre := System
    FROM tableX
       , (SELECT @statusPre:=NULL, @systemPre:=NULL) AS d
    ORDER BY System
           , Timestamp
  ) AS good
WHERE statusChanged ;

 

참조 페이지 https://stackoverflow.com/questions/6560000

 

 

반응형

댓글