2014-11-14 131 views
0

我有一張表,我試圖使用公共表表達式來查找重複行。是我工作的字段如下:CTE沒有返回預期值

LOGTIME(數據類型:DATETIME2(7),NULL) ControllerIP(數據類型:nvchar(最大值),NULL)

我有兩行數據是有據我所知,它們中的數據相同。我對兩列進行了LEN檢查,以確保它們的長度相同,但在下面使用CTE時,行不會重複爲 。 LogTime列有什麼不同嗎?我從來沒有碰到過這個。

WITH CTE AS 
(
SELECT rn = ROW_NUMBER() 
      OVER( 
       PARTITION BY LogTime , ControllerIP 
       ORDER BY Id ASC), * 
FROM [DownTime].[dbo].[Records] 
) 
SELECT * FROM cte 
WHERE FileName = '141101.CSV' AND rn > 1 
Order By ID 
GO 

此外,我正在使用Microsoft SQL Server 2008R2。

+0

'LEN'不計尾隨空格(和其他非打印字符),所以2個值具有相同LEN和看起來一樣,並不意味着它們具有相同的數據 – Lamak 2014-11-14 14:41:04

+1

從邏輯上講,你的找到重複的策略是合理的。 LogTime或ControllerIP必須不同。 – 2014-11-14 14:41:32

+0

好的。我認爲它的確如此。我會谷歌如何做到這一點,沿着這條道路走下去。 – 2014-11-14 14:42:18

回答

1

你的計劃是健全的。如果你沒有發現重複,那是因爲重複不存在。您可以將某些函數應用於列以更有可能查找重複項,例如修剪IP空間並降低datetime2的精度。

WITH CTE AS (
    SELECT rn = ROW_NUMBER() OVER( 
     PARTITION BY CAST(LogTime AS datetime2(2)), RTRIM(LTRIM(ControllerIP)) 
     ORDER BY Id ASC), * 
    FROM [DownTime].[dbo].[Records] 
) 
SELECT * FROM cte 
WHERE FileName = '141101.CSV' AND rn > 1 
Order By ID 
+0

我最終得到這個工作的方式是通過一個c#控制檯應用程序運行我的對象。我爲每個對象使用了string.trim()方法並將其保存回數據庫。這清理了數據,我開始在預期的地方看到重複的內容。 – 2014-11-19 12:13:37