2014-09-30 4 views
0

У меня есть следующий код, который сравнивает String перед ним, чтобы увидеть, соответствуют ли они. Код работает над записями, что есть только 1 или 2 обмана.Удаление дублированных данных в SQL Server 2008

Example

Если есть 3 или более, то текущий код не работает.

Что мне нужно сделать, так это показать старый код как идентификатор этой строки. Новый код должен быть 1-м совпадающим элементом в списке, в примере это будет 131133. Это должен быть новый код для всех элементов, которые соответствуют.

Мне нужен код, который был заменен, чтобы появиться в Deleted code и только код, который был заменен. в примере это должно быть 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