SQL:在一个列中查找在另一列中也不唯一的非唯一记录

Posted

技术标签:

【中文标题】SQL:在一个列中查找在另一列中也不唯一的非唯一记录【英文标题】:SQL: Find non-unique records in one column that are also non-unique in another column 【发布时间】:2014-03-05 23:19:40 【问题描述】:

我有一张地点及其地区的表格,但有时同一地区有多个同名地点。现实生活中的例子:有five Springfields in Wisconsin。我住的新斯科舍省有three Sandy Coves。我需要找到这些类型的记录并消除它们的歧义(例如,通过添加他们的县或等效项)或者只是删除垃圾/重叠的记录。这需要一些工作,但首先我想看看有多少工作。

PlaceName:    RegionName:
Summerville   Big State
Summerville   Bigger State (OK, different states, no problem...)
Summerville   Little State <- 
Summerville   Little State <- I need to deal with these

此查询基于来自另一个 question 的 answer,它为我提供了所有同名地点:

SELECT * FROM Places WHERE PlaceName IN
  (SELECT PlaceName FROM Places GROUP BY PlaceName HAVING COUNT(*) > 1);

这是一个好的开始,但我想跳过在同一状态下不多次出现的名称,直接进入问题案例。概括地说,我想在一列中查找非唯一记录,然后从那里获取另一列中非唯一的记录。

(FWIW,我使用的是 MariaDB,它主要与 mysql 兼容。)

【问题讨论】:

【参考方案1】:

一种方法是使用join 到聚合列表。您需要按地区和地点进行汇总才能获得所需的列表:

SELECT p.*, rp.cnt
FROM Places p join
     (SELECT RegionName, PlaceName, COUNT(*) as cnt
      FROM Places
      GROUP BY  RegionName, PlaceName
      HAVING COUNT(*) > 1
     ) rp
     on p.RegionName = rp.RegionName and p.PlaceName = rp.PlaceName;

您没有提及您正在使用的实际数据库。还有其他表达方式,其中一些取决于数据库。

【讨论】:

谢谢!我正在使用 MariaDB(与 MySQL 兼容)。【参考方案2】:

基本上你想要

首先计算每个(地点/区域)元组存在的频率 然后只过滤那些出现多次的那些

所以我们就这样做吧

SELECT
  PlaceName, RegionName, Count(*) AS num
FROM Places
  GROUP BY CONCAT(PlaceName,':::',RegionName)
HAVING COUNT(*)>1

【讨论】:

这里不需要 concat,只需按两个字段分组即可。 这很有用 - 我没有得到每条记录,但我可以看到:Sandy Cove | Nova Scotia | 3。谢谢!【参考方案3】:

我认为你可以只连接列:

SELECT * FROM Places WHERE PlaceName + RegionName IN
(SELECT PlaceName + RegionName FROM Places GROUP BY PlaceName + RegionName HAVING COUNT(*) > 1);

如果我错了,我相信其他 ***ers 会告诉我的!! :D

【讨论】:

它对我不起作用,它实际上扩大了结果集!不过谢谢!【参考方案4】:

我不确定,但似乎只是简单地按两个字段分组

 select PlaceName , RegionName
 from Places
 group by PlaceName , RegionName
 having count(*) >1

【讨论】:

这似乎确实获得了符合条件的记录,但只有一个。但它确实告诉我需要处理多少组。

以上是关于SQL:在一个列中查找在另一列中也不唯一的非唯一记录的主要内容,如果未能解决你的问题,请参考以下文章

SQL - 计算一个列值在另一列中的出现

Pandas,对于一列中的每个唯一值,在另一列中获取唯一值

如何在另一列中按条件分组的列中查找下一个日期?

Excel 查找某列中的数值有没有在另一列中出现

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

如果一列中存在数字,则在另一列中查找与该数字相对应的值