2014-09-30 4 views
0

일치하는지 확인하기 전에 문자열을 비교하는 벨로우즈 코드가 있습니다. 이 코드는 단지 1 ~ 2 개의 중복 코드가있는 레코드 작업을합니다.SQL Server 2008에서 중복 된 데이터 제거

Example

3 현재 코드가 작동하지 않는 다음 더있는 경우.

내가해야 할 일은 이전 코드를 해당 라인의 ID로 표시하는 것입니다. 새 코드는 목록에서 첫 번째로 일치하는 항목이어야합니다 (예 : 131133). 일치하는 모든 항목에 대한 새 코드 여야합니다.

그런 다음 삭제 된 코드 및 교체 된 코드에만 표시되도록 대체 된 코드가 필요합니다. 이 예에서 141439 여야합니다.

내 코드를 사용하여이 작업을 수행 할 수 있습니까? 아니면 다른 각도에서 처리해야합니까?

미리 감사드립니다.

;WITH MyCTE AS 
(
SELECT *, 
ROW_NUMBER()OVER (ORDER BY SortField) AS rn 
FROM Aron_Reporting.dbo.Customer_Sort 
) 
SELECT T1.Forename as Forename, T1.pcode, T1.Surname as Surname,T1.SortField AS T1String, 
T2.SortField AS T2String, 
T1.IDNO as OldCode, 

CASE 
WHEN T1.SortField IS NULL OR T1.SortField = ' ' OR T2.SortField = ' ' or T2.SortField IS NULL  THEN T1.IDNO 
WHEN T1.SortField = T2.SortField THEN T2.IDNO ELSE T1.IDNO END AS NewCode, 

CASE 
WHEN T1.SortField IS NULL OR T1.SortField = ' ' or T2.SortField = ' ' or T2.SortField IS NULL THEN ' ' 

WHEN T1.SortField = T2.SortField THEN T2.IDNO ELSE ' ' END AS DeleteCode 

    FROM MyCTE T1 
    LEFT JOIN MyCTE T2 
ON T1.rn = T2.rn+1 
+0

필자는 스키마를 더 잘 이해할 수 있도록 SQL Fiddle 데모를 만드는 것이 가장 좋습니다. 그런 다음 우리는 도울 수있었습니다. 이전에 관련된 질문을 언급하는 것도 좋습니다. http://stackoverflow.com/questions/26054898/sql-if-record-equals-the-record-before-it –

+0

죄송합니다. SQL Fiddle 데모가 무슨 의미인지 모르시겠습니까? 이걸 어떻게 만들 수 있습니까? 건배 –

답변

0

정확히 무엇을하려는 것인지 잘 모르겠습니다. 잘하면이 도움이됩니다.

하위 쿼리를 사용하여 원하는 코드를 계산하면 여러 개의 중복을 처리 할 수 ​​있습니다. 하위 쿼리는 일치하는 첫 번째 레코드 (자체 포함)를 반환해야합니다.

아래의 예는 데이터가 조작되는 방식을 정확하게 볼 수 있도록 작은 단계로 나뉩니다.

-- Generate table structure 
DECLARE @TestData TABLE (
    ID INT 
    , ValueToCompare VARCHAR(MAX) 
    , Code INT 
    , NewCode INT 
) 


-- Generate test data 
INSERT INTO @TestData 
     (ID, ValueToCompare, Code) 
VALUES (1, 'John', 1134), (2, 'Joe', 1546), (3, 'Joe', 1893), (4, 'Joe', 9785), (5, 'Joe', 9452) 


-- View the original data 
SELECT * 
FROM @TestData 


-- View what the NewCode will be 
SELECT ID 
    , ValueToCompare 
    , Code 
    , (SELECT MIN(Code) -- This subquery uses the MIN statement to grab the first record from a list of matching records 
     FROM @TestData SubQueryData 
     WHERE MainQueryData.ValueToCompare = SubQueryData.ValueToCompare 
     ) AS 'New_Code' 
FROM @TestData MainQueryData 


-- Set the NewCode value 
UPDATE @TestData 
SET NewCode = (SELECT MIN(Code) 
     FROM @TestData SubQueryData 
     WHERE MainQueryData.ValueToCompare = SubQueryData.ValueToCompare 
     ) 
FROM @TestData MainQueryData 


-- Delete duplicate records 
DELETE 
FROM @TestData 
WHERE Code <> NewCode 


-- View the resulting data 
SELECT * 
FROM @TestData