2014-09-30 67 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