1

我正在寻找一种方法来搜索表中的重复值并将这些重复值(甚至只是一组重复值中的一个)作为结果集返回。

例如,假设我有这些数据:

uid | 半唯一标识
1 | 12345
2 | 21345
3 | 54321
4 | 41235
5 | 12345
6 | 21345

我需要返回:

12345
12345
21345
21345

或者:

12345
21345

我试过用谷歌搜索并不断缩短。请问有什么帮助吗?

4

3 回答 3

3

对不起,我之前时间不够,所以我无法解释我的答案。第一个查询对相同的 semi_unique_id 进行分组,并仅返回具有重复项的那些。

SELECT semi_unique_id
FROM your_table
GROUP BY semi_unique_id
HAVING COUNT(semi_unique_id) > 1

如果您也想在查询中获取 uid,您可以像这样轻松添加它。

SELECT uid,
       semi_unique_uid
FROM   your_table
GROUP BY
       semi_unique_id,
       uid
HAVING COUNT(semi_unique_id) > 1

最后,如果您想了解每行返回多少重复项,您可以执行以下操作。

SELECT uid,
       semi_unique_uid,
       COUNT(semi_unique_uid) AS unique_id_count
FROM   your_table
GROUP BY
       semi_unique_id,
       uid
HAVING COUNT(semi_unique_id) > 1
于 2013-01-24T02:37:44.023 回答
3

要获取每一行,您可以使用窗口函数:

select t.*
from (select t.*, count(*) over (partition by [semi-unique id]) as totcnt
      from t
     ) t
where totcnt > 1

要仅获取一个实例,请尝试以下操作:

select t.*
from (select t.*, count(*) over (partition by [semi-unique id]) as totcnt,
             row_number() over (partition by [semi-unique id] order by (select NULL)
                               ) as seqnum
      from t
     ) t
where totcnt > 1 and seqnum = 1

这种方法的优点是您可以获得所有列,而不仅仅是 id(如果有帮助的话)。

于 2013-01-24T02:44:23.830 回答
1
SELECT t.semi_unique_id AS i
FROM   TABLE t
GROUP BY
       t.semi_unique_id
HAVING (COUNT(t.semi_unique_id) > 1)

试试这个 sql-server

于 2013-01-24T05:05:56.827 回答