0

의도적으로 중복 된 테이블이 있습니다. 이 인스턴스에서 중복 될 것은 deviceId와 datetime입니다. 고객이 데이터를 업데이트하는 경우가 있습니다. 테이블에는 deviceId, datetime 및 value의 세 개의 열이 있습니다 (증분 기본 키가 있음). 때로는 고객이 데이터를 다시 평가할 때 값이 잘못되었다는 것을 알게되면 데이터를 업데이트하고 다시 처리하기 위해 데이터를 보냅니다. 따라서 최신 레코드가 아닌 레코드를 삭제할 수 있어야합니다. datetime으로이 작업을 수행 할 수없는 경우도 있습니다.이 작업은 복제되는 경우가 있기 때문에 준비 테이블을자를 수 없습니다. 최신이 아닌 모든 레코드 삭제

나는 다음과 같은 한 속는을 삭제하려면이와

;WITH DupeData AS (
SELECT ROW_NUMBER() OVER(PARTITION BY tblMeterData_Id,fldDateTime, fldValue, [fldBatchId],[fldProcessed] ORDER BY fldDateTime) AS ROW 
FROM [Stage.tblMeterData]) 
DELETE FROM DupeData 
WHERE ROW > 1 

문제, 임의의 중복을 삭제하는 것입니다.

스테이징 영역에있는 최신 레코드를 유지하고 최신 레코드가 아닌 다른 레코드를 삭제하고 싶습니다. 그런 다음 최신 값을 사용하여 관련 행을 새 값으로 업데이트 할 수 있습니다. 준비에서 스테이징으로 가져 가면됩니다.

+0

테이블에 어떤 기본 또는 고유 키입니다에 확인 작업을해야 -이 고유 ID를의 경우? 'DupeData 에서 삭제 여기서 ID [스테이지 FROM ROW AS tblMeterData_Id, fldDateTime, fldValue [fldBatchId] BY ( SELECT ID, ROW_NUMBER() OVER (PARTITION [fldProcessed] fldDateTime BY ORDER)로부터 (ID를 선택한다. tblMeterData]) ) q 여기서 q.row> 1)' – are

+0

테이블을 보내는 데 사용한 증분 Id 만. –

+0

페니가 방금 떨어 졌다고 생각합니다! –

답변

0

은 테이블의 기본 키나 고유 키입니다. 성능에 대한 아래 가장 쉬운 방법은 확실하지하지만 소량

DELETE FROM DupeData 
where id in 
(select id from 
(SELECT id, 
    ROW_NUMBER() OVER(PARTITION BY tblMeterData_Id,fldDateTime, fldValue, [fldBatchId],[fldProcessed] ORDER BY fldDateTime) AS ROW 
FROM [Stage.tblMeterData]) 
) q 
where q.row > 1) 
+0

나는 각 장치 ID마다 4 개의 중복을 가지고 있음에도 불구하고 아무런 영향을 미치지 않고 있습니다. 나는 그것으로 주변을 둘러 보려고 시도했으나 삭제할 사기꾼을 찾지 못했다. 쿨 –

+0

는 [Stage.tblMeterData] \t \t \t ( \t \t \t SELECT ID FROM \t ( \t \t SELECT ID IN ID, tblMeterData_Id BY ROW_NUMBER() OVER (PARTITION, fldDateTime의 주문에서 삭제 –

+0

잘 작동하고 있어요 ROW AS fldDateTime DESC) BY [Stage.tblMeterData] \t \t) FROM Q AS \t \t \t \t \t WHERE QR OW> 1 \t) –