2014-03-19 70 views
3
TableOne 

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

我只需要提取PersonId出現的那些行不止一次例如以下是我想要實現選擇不止一次出現的行

 PersonId  PersonScore 
     1    10 
     1    20 
     2    99 
     2    40 

我使用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 

問題是,它消除了多餘的行中的結果。它any任何PersonId的第一個實例。任何人都可以提出一個解決方案,請

+1

可能重複[SQL Server計數分組](http://stackoverflow.com/questions/4700155/sql-server-count-on-a-grouped-by) –

+0

@TomaszKowalczyk:他不想要計數任何東西,但會得到包含不唯一的PersonId的完整行。所以'GROUP BY'是錯誤的方法。 –

回答

3

你想用count(*)作爲窗口函數,而不是row_number()

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