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问题是它删除了额外的行。它移动任何PersonId的第一个实例。有谁能提出解决办法吗?
发布于 2014-03-19 15:06:34
您希望使用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;发布于 2014-03-19 15:08:24
SELECT *
FROM TableOne t1
JOIN (SELECT PersonId
FROM TableOne
GROUP BY PersonId
HAVING COUNT(*) > 1) t2
on t1.PersonId = t2.PersonId发布于 2014-03-19 15:13:03
您可以使用一个简单的相关子查询:
SELECT PersonId, PersonScore
FROM dbo.TableOne t1
WHERE (SELECT COUNT(*)
FROM dbo.TableOne t2
WHERE t1.PersonId = t2.PersonID) > 1https://stackoverflow.com/questions/22509939
复制相似问题