문제
데이터 파일에서 가져온 곳에있는 WHO 일련의 데이터 행이 포함 된 스테이징 테이블이 있습니다.
각 행은 원격 시스템에서 행으로 변경되는 것을 자세히 설명하며 행은 모든 변경 후에 취한 소스 행의 스냅 샷입니다. 각 행에는 생성 및 업데이트를위한 메타 데이터 타임 스탬프가 포함되어 있습니다.
이제 모든 업데이트가 포함 된 이러한 데이터 파일에서 업데이트 테이블을 작성하려고합니다. 최신 "업데이트"타임 스탬프로 행만 유지하는 중복 키로 행을 제거하는 방법이 필요합니다.
키 필드를 정렬하고 중복을 제거하라고 지시하여 SSIS "Sort"변환을 사용하여 복제를 제거 할 수 있지만, 유지하는 행이 최신 타임 스탬프가있는 것인지 확인하는 방법은 무엇입니까?
해결책
COL1, COL2 등에서 일치하는 행을 제거하고 최신이 아닌 업데이트가 있습니다.
DELETE D
FROM MyTable AS D
JOIN MyTable AS T
ON T.Col1 = D.Col1
AND T.Col2 = D.Col2
...
AND T.UpdateDate > D.UpdateDate
col1과 col2가 모두 null이라면 "일치"로 간주되어야한다면 사용해야합니다.
ON (T.Col1 = D.Col1 OR (T.Col1 IS NULL AND D.Col1 IS NULL))
AND (T.Col2 = D.Col2 OR (T.Col2 IS NULL AND D.Col2 IS NULL))
...
편집하다: 사례에 대해 사례 민감한 테스트를 해야하는 경우 에그런 다음 Varchar 및 텍스트 열에서 민감한 데이터베이스를 사용합니다.
ON (T.Col1 = D.Col1 COLLATE Latin1_General_BIN
OR (T.Col1 IS NULL AND D.Col1 IS NULL))
...
다른 팁
SSI의 정렬 변환을 사용하여 데이터 세트를 둘 이상의 열로 정렬 할 수 있습니다. 기본 키 (또는 ID 필드)에 따라 타임 스탬프 열을 내림차순으로 정렬하십시오.
정렬 변환 작업에 대한 자세한 내용은 다음 기사를 참조하십시오.
http://msdn.microsoft.com/en-us/library/ms140182.aspx
이해가 되나요?
건배, 존
스테이징에서 최종 테이블로 이동할 때 중복을 무시하는 것이 합리적입니까?
어쨌든이 작업을 수행해야하므로 2 개가 아닌 스테이징 테이블에 대해 하나의 쿼리를 발행하지 않겠습니까?
INSERT final
(key, col1, col2)
SELECT
key, col1, col2
FROM
staging s
JOIN
(SELECT key, MAX(datetimestamp) maxdt FROM staging ms ON s.key = ms.key AND s.datetimestamp = ms.maxdt