2014-09-30 49 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 – 2014-09-30 10:14:05

+0

對不起,我不知道你是什麼意思的SQL小提琴演示,我怎麼能創建這個?乾杯 – 2014-09-30 10:41:03

回答

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