이 작업을 수행하는 또 다른 방법은
;
--Ensure that any immediately preceding statement is terminated with a semicolon above
WITH cte
AS (SELECT ROW_NUMBER() OVER (PARTITION BY Col1, Col2, Col3
ORDER BY ( SELECT 0)) RN
FROM #MyTable)
DELETE FROM cte
WHERE RN > 1;
ORDER BY (SELECT 0)
넥타이의 경우 보존 할 행이 임의이므로 위의 내용을 사용 하고 있습니다.
RowID
예를 들어 최신을 유지하려면 다음을 사용할 수 있습니다.ORDER BY RowID DESC
실행 계획
이를위한 실행 계획은 자체 참여가 필요하지 않기 때문에 승인 된 답변보다 간단하고 효율적입니다.
그러나 항상 그런 것은 아닙니다. 한 곳에서 GROUP BY
솔루션을 선호 될 수는 상황이다 해시 집계는 스트림 집계에 우선하여 선택 될 것이다.
ROW_NUMBER
반면 솔루션은 항상 거의 같은 계획을 줄 것이다 GROUP BY
전략이 더 유연합니다.
해시 집계 방식을 선호하는 요소는 다음과 같습니다.
- 분할 열에 유용한 인덱스가 없습니다.
- 각 그룹에서 상대적으로 더 많은 중복을 가진 상대적으로 적은 그룹
이 두 번째 경우의 극단적 인 버전 (각각에 중복이 많은 그룹이 거의없는 경우)은 단순히 새 테이블에 보관하기 위해 행을 삽입 한 다음 TRUNCATE
원본을 복사하고 다시 복사하여 삭제와 비교하여 로깅을 최소화 하는 것을 고려할 수 있습니다 매우 높은 비율의 행.
DELETE FROM
CTE 용어를 직접 사용할 수 없습니다 . stackoverflow.com/q/18439054/398670