2012-07-09 1 views
1

현재 고유 인덱스가없는 테이블에서 레코드를 선택하는 작업 설정이 있습니다. 이 문제는 테이블과 관련 칼럼에 색인을 붙임으로써 해결할 수 있습니다. 그러나이 시나리오에서는 테스트를 위해 인덱스를 제거한 다음 2 컬럼을 기준으로 중복을 제거해야하는 select를 수행해야합니다.sql은 3 개의 열을 선택하고 두 개의 열을 중복 제거합니다.

SELECT DISTINCT [author], [pubDate], [dateadded] 
FROM [Feeds].[dbo].[socialPosts] 
WHERE CAST(FLOOR(CAST(dateadded AS float)) AS datetime) > 
           DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE() - 2), 0) 
AND CAST(FLOOR(CAST(dateadded AS float)) AS datetime) < 
           DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0) 

이렇게하면 전날의 모든 기록을 선택하며 작성자와 게시자를 기준으로 기록을 삭제합니다. 게시물 선택 또는 이전에 수행 할 수 있지만 생각은 선택 내에서 완료 할 수 있는지 확인하는 것입니다.

+0

실제로 'dateadded'를 _float_ 값으로 저장 하시겠습니까? 왜 실제 날짜/타임 스탬프 값이 아닌가? 또한 하한 경계, 상한 배타적 범위를 수행해야합니다 ('> - 2 '비트는 오프셋됩니다). 'dateadded'와 다른 컬럼 사이의 관계는 무엇입니까? - 간단한 MAX()가 사용될 수 있습니까? –

+0

dateadded는 실제로 datetime으로 저장됩니다 ... 다른 방법으로 작업 할 수 있는지 확실하지 않았습니다 ... dateadded는 특정 레코드의 날짜이며 전날의 총 레코드를 가져와야합니다. – vbNewbie

+0

저장된 데이터에 대해 아무 것도 할 필요가 없습니다. 이미 '정확합니다'. 캐스팅을 내버려 둡니다 (어떤 도움도 안됨). 나는 그것이 완전히 안전하다고 확신하지 못한다. 귀하의 상한선은 그대로 있어야합니다. 하한은'dateadded> = DATEADD (DAY, DATEDIFF (DAY, 0, GETDATE()) - 1, 0)'로 변경되어야합니다. –

답변

1

dateadded 열에 GROUP BY 및 집계 함수를 사용하면 author, pubdate 결과가 고유 해집니다.

SELECT [author] 
     ,[pubDate] 
     ,MAX([dateadded]) 
FROM [Feeds].[dbo].[socialPosts] 
WHERE CAST(FLOOR(CAST(dateadded AS float)) AS datetime) > dateadd(day,datediff(day, 0, getdate()-2), 0) 
     AND CAST(FLOOR(CAST(dateadded AS float)) AS datetime) < dateadd(day,datediff(day, 0, getDate()), 0) 
GROUP BY 
     [author] 
     , [pubdate] 
+0

고마워요. – vbNewbie