2014-03-19 3 views
3
TableOne 

     PersonId  PersonScore 
     1    10 
     1    20 
     2    99 
     2    40 
     3    45 

PersonId가 두 번 이상 나타나는 행만 반입해야합니다. 다음은 내가 CTE두 번 이상 표시되는 행 선택

;WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY i.PersonId ORDER BY i.PersonId) AS [Num] 
    FROM TableOne i 
    ) 
    SELECT * 
    FROM cte 
    WHERE cte.Num > 1 

문제는이 여분의 열을 제거하는 것입니다을 사용하고

 PersonId  PersonScore 
     1    10 
     1    20 
     2    99 
     2    40 

달성하고자하는 결과 집합입니다. PersonId의 첫 번째 인스턴스를 낭독합니다. 사람이 당신은 오히려 row_number()보다, 윈도우 함수로 count(*)을 사용하려면

+1

을 가능한 중복 [그룹화 된 SQL Server 수] (http://stackoverflow.com/questions/4700155/sql-server-count-on-a-grouped-by) –

+0

@TomaszKowalczyk : 그는 원하지 않습니다. 수를 세지 만 고유하지 않은 PersonId가 포함 된 완전한 행을 얻습니다. 따라서 'GROUP BY'가 잘못된 방법입니다. –

답변

3

을 솔루션을하시기 바랍니다 제안 할 수 있습니다 :

select t.PersonId, t.PersonScore 
from (select t.*, count(*) over (partition by PersonId) as cnt 
     from TableOne t 
    ) t 
where cnt > 1; 
+0

위대한,이 매력처럼 작동합니다. 많은 감사 – InTheWorldOfCodingApplications

1
SELECT * 
FROM TableOne t1 
JOIN (SELECT PersonId 
     FROM TableOne 
     GROUP BY PersonId 
     HAVING COUNT(*) > 1) t2 
on t1.PersonId = t2.PersonId 
당신은 간단한 상관 하위 쿼리를 사용할 수
1

:

SELECT PersonId, PersonScore 
FROM dbo.TableOne t1 
WHERE (SELECT COUNT(*) 
     FROM dbo.TableOne t2 
     WHERE t1.PersonId = t2.PersonID) > 1