2014-11-14 1 views
0

공통 테이블 식을 사용하여 중복 행을 찾으려는 테이블이 있습니다. 다음 I은 작업 필드는 :CTE가 예상 값을 반환하지 않습니다.

LogTime (데이터 타입 : DATETIME2 (7), NULL) ControllerIP (데이터 타입 : NULL nvchar (최대))

I는이 두 개의 데이터 행이 내가 말할 수있는 한 그들 안에있는 같은 데이터. 두 열 모두 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 2008 R2를 사용하고 있습니다.

+0

'공간 (및 기타 비 인쇄 문자) 때문에,이 개 같은 렌과 가치와 그 같은 모습을, 후행 계산하지 않습니다 LEN'은, 당신을 동일한 데이터가 논리적으로 – Lamak

+1

있는 것을 의미하지 않는다 중복을 찾는 전략은 건전합니다. LogTime 또는 ControllerIP가 서로 달라야합니다. –

+0

오케이. 나는 그랬다고 생각했다. 나는 그렇게 할 방법을 구글에게 알려줄 것이고 그 길로 갈 것이다. –

답변

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() 메서드를 사용하여 데이터베이스에 다시 저장했습니다. 이렇게하면 데이터가 정리되고 예상 한 곳에서 복제본을 볼 수 있습니다. –