열 값이 변경된 행 선택: SQL 기법
열 값이 전환되는 인스턴스를 확인하는 것은 다양한 작업에서 중요한 작업입니다. 데이터 분석 시나리오. 이 문서에서는 테이블에서 이러한 변경 사항을 효율적으로 식별하는 기술을 살펴봅니다.
문제 설명
"값" 및 "시간" 열이 있는 다음 테이블을 고려하세요.
Value | Time | |
---|---|---|
0 | 15/06/2012 8:03:43 PM | |
1 | 15/06/2012 8:03:43 PM | * |
1 | 15/06/2012 8:03:48 PM | |
1 | 15/06/2012 8:03:53 PM | |
1 | 15/06/2012 8:03:58 PM | * |
2 | 15/06/2012 8:04:03 PM | * |
2 | 15/06/2012 8:04:08 PM | |
3 | 15/06/2012 8:04:13 PM | * |
3 | 15/06/2012 8:04:18 PM | |
3 | 15/06/2012 8:04:23 PM | |
2 | 15/06/2012 8:04:28 PM | * |
2 | 15/06/2012 8:04:33 PM |
이 작업은 "값"의 전환을 나타내는 "*"로 표시된 행을 식별하는 것입니다. 컬럼.
솔루션
창 기능 사용(SQL Server 2012 이상)
SQL Server에 도입된 창 기능 포함 2012년부터 이 작업을 수행할 수 있습니다. 효율적으로:
;WITH x AS ( SELECT value, time, rn = ROW_NUMBER() OVER (PARTITION BY Value ORDER BY Time) FROM dbo.table ) SELECT * FROM x WHERE rn = 1;
이 쿼리는 "값"의 각 파티션 내의 행 번호를 계산하고 각 파티션의 첫 번째 행(rn = 1)을 선택합니다.
테이블 조인 사용 (SQL Server 2008 이하)
2012 이전 SQL Server 버전의 경우 다음 접근 방식을 따르세요. 다음을 사용할 수 있습니다.
DECLARE @x TABLE(value INT, [time] DATETIME) INSERT @x VALUES (0,'20120615 8:03:43 PM'),-- (1,'20120615 8:03:43 PM'),--* (1,'20120615 8:03:48 PM'),-- (1,'20120615 8:03:53 PM'),-- (1,'20120615 8:03:58 PM'),-- (2,'20120615 8:04:03 PM'),--* (2,'20120615 8:04:08 PM'),-- (3,'20120615 8:04:13 PM'),--* (3,'20120615 8:04:18 PM'),-- (3,'20120615 8:04:23 PM'),-- (2,'20120615 8:04:28 PM'),--* (2,'20120615 8:04:33 PM'); ;WITH x AS ( SELECT *, rn = ROW_NUMBER() OVER (ORDER BY time) FROM @x ) SELECT x.value, x.[time] FROM x LEFT OUTER JOIN x AS y ON x.rn = y.rn + 1 AND x.value <> y.value WHERE y.value IS NOT NULL;
이 쿼리는 테이블에서 자체 조인을 수행하여 인접한 행을 비교하여 값 변경을 식별합니다. 중간 결과를 저장하려면 별도의 테이블 변수가 필요합니다.
참고: 창 기능은 더 나은 성능을 제공하지만 일부 SQL Server 버전에서는 사용하지 못할 수도 있습니다. 귀하의 버전과 성능 요구 사항에 가장 적합한 접근 방식을 선택하세요.
위 내용은 SQL에서 열 값이 변경되는 행을 효율적으로 식별하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!