在列中查找具有重复值的行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在列中查找具有重复值的行相关的知识,希望对你有一定的参考价值。

我有一张桌子author_data

 author_id | author_name
 ----------+----------------
 9         | ernest jordan
 14        | k moribe
 15        | ernest jordan
 25        | william h nailon 
 79        | howard jason
 36        | k moribe

现在我需要结果如下:

 author_id | author_name                                                  
 ----------+----------------
 9         | ernest jordan
 15        | ernest jordan     
 14        | k moribe 
 36        | k moribe

也就是说,我需要author_id用于具有重复外观的名称。我试过这句话:

select author_id,count(author_name)
from author_data
group by author_name
having count(author_name)>1

但它不起作用。我怎么能得到这个?

答案

我建议在子查询中使用window function

SELECT author_id, author_name  -- omit the name here, if you just need ids
FROM (
   SELECT author_id, author_name
        , count(*) OVER (PARTITION BY author_name) AS ct
   FROM   author_data
   ) sub
WHERE  ct > 1;

您将识别基本的聚合函数count()。它可以通过附加OVER子句变成窗口函数 - 就像任何其他聚合函数一样。

这样,它计算每个分区的行数。瞧。

在没有窗口功能(v.8.3或更早版本)的旧版本中 - 或者通常 - 此替代方案执行速度非常快:

SELECT author_id, author_name  -- omit name, if you just need ids
FROM   author_data a
WHERE  EXISTS (
   SELECT 1
   FROM   author_data a2
   WHERE  a2.author_name = a.author_name
   AND    a2.author_id <> a.author_id
   );

如果您关注性能,请在author_name上添加索引。

另一答案

您可以将表连接到自身,这可以通过以下任一查询实现:

SELECT a1.author_id, a1.author_name
FROM authors a1
CROSS JOIN authors a2
  ON a1.author_id <> a2.author_id
  AND a1.author_name = a2.author_name;

-- 9 |ernest jordan
-- 15|ernest jordan
-- 14|k moribe
-- 36|k moribe

--OR

SELECT a1.author_id, a1.author_name
FROM authors a1
INNER JOIN authors a2
  WHERE a1.author_id <> a2.author_id
  AND a1.author_name = a2.author_name;

-- 9 |ernest jordan
-- 15|ernest jordan
-- 14|k moribe
-- 36|k moribe
另一答案

你已经到了一半了。您只需使用已识别的Author_IDs并获取其余数据。

试试这个..

SELECT author_id, author_name
FROM author_data
WHERE author_id in (select author_id
        from author_data
        group by author_name
        having count(author_name)>1)

以上是关于在列中查找具有重复值的行的主要内容,如果未能解决你的问题,请参考以下文章

SQL - 在列中查找具有特定值组合的行

MySQL:如何在列中选择具有某些值的 ID [重复]

查找一列中具有相同值而另一列中具有其他值的行?

在列中查找字母并提取包含特定字母的行

Pandas - 在两列中查找具有匹配值的行并在另一列中相乘

如何更改我的 sql 查询,以便删除列中具有某些值的行 [重复]