반응형
타임 스탬프를 늘려 정렬 된이 (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
반응형
'MySql' 카테고리의 다른 글
MySQL PHP, MySQLi 및 Prepared Statement를 사용하여 삽입 된 행의 ID를 어떻게 반환합니까? (0) | 2020.10.04 |
---|---|
MySQL PHP 및 JavaScript를 사용하여 콤보 상자를 mysql 테이블 값으로 동적으로 채우기 (0) | 2020.10.04 |
MySQL 위도와 경도를 사용하여 가장 가까운 위치 얻기 (0) | 2020.10.04 |
MySQL "where"및 "or"문 (0) | 2020.10.04 |
MySQL 두 개의 SELECT 쿼리 병합 (0) | 2020.10.04 |
댓글