首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找相等的双记录postgresql

查找相等的双记录postgresql
EN

Stack Overflow用户
提问于 2015-02-21 08:02:58
回答 3查看 86关注 0票数 0

我有一家有60栏的桌子公司。目标是创建一个工具来查找、比较和消除此表中的重复项。

示例:我有一个id 22的记录,并且我知道它有一个孪生体,因为我运行这个(简化的代码):

代码语言:javascript
复制
SELECT min(co_id),co_name,count(*) FROM co
GROUP BY co_name
HAVING count(*) > 1

结果显示,有一个孪生姐妹(计数2),我得到了最小的id (Co_id)。

我的问题是如何寻找双胞胎co_id?刚刚通过了最古老的身份证?

类似于:

代码语言:javascript
复制
SELECT co_id FROM co
WHERE co_name EQUAL TO co_id='22'
LIMIT 2

样本数据:

代码语言:javascript
复制
id    co_name
22    Volvo
23    Volvo
24    Ford
25    Ford

我知道id 22,我想根据22的内容搜索双胞胎23。

我发现的最接近的就是这个。这远远不是通用的。一个比较60个领域的噩梦:

代码语言:javascript
复制
SELECT id,
(SELECT max(b.id) from co b 
WHERE a.co_name = b.co_name 
LIMIT 1) as twin
FROM co a
WHERE id='22'

我如何以一种更简单、更通用的方式来做到这一点呢?我只想要双份唱片co_id。

提前谢谢你!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-21 11:16:02

我找到了一个解决方案,如果在查询中使用变量而不是硬代码,则可以处理60列。谢谢大家的投入。他们中的一些人几乎是同一条轨道。

代码语言:javascript
复制
SELECT id,
(SELECT max(b.id) from co b 
WHERE concat(a.co_name,etc) = concat(b.co_name,etc)
LIMIT 1) as twin
FROM co a
WHERE id='22'

不是最好的,但一次只取一个双胞胎。而且它还远不是一般的。谢谢你为我指明正确的方向。一个通用的解决方案会更好。

票数 0
EN

Stack Overflow用户

发布于 2015-02-21 08:56:29

选择max_co,co_name,from (选择max(co_id) max_co,min(co_id) min_co,co_name,从co_name中选择min_co=(*)>1),其中min_co=(以原来的co_id作为输入);

票数 0
EN

Stack Overflow用户

发布于 2015-02-21 09:20:17

您可以使用它本身加入您的表:

代码语言:javascript
复制
SELECT c1.*
FROM
  co_name c1 INNER JOIN co_name c2
  ON c1.co_name=c2.co_name
     AND c1.id>c2.id

这将返回所有重复的记录(但不返回具有最低id的原始记录)。或者,由于您使用Postgresql,所以可以使用一个窗口函数:

代码语言:javascript
复制
SELECT *
FROM (
  SELECT
    id,
    co_name,
    row_number() OVER (PARTITION by co_name ORDER BY id) as row
  FROM
    co_name
  ) s
WHERE
  row>1;

请看一个例子这里

如果要比较多列,联接解决方案将更灵活。我不知道您希望如何比较您的列,以及如何确切地定义“孪生”行,但是这样的查询应该会有所帮助:

代码语言:javascript
复制
SELECT c1.*
FROM
  co_name c1 INNER JOIN co_name c2
  ON (
       c1.co_name=c2.co_name
       OR c1.co_city=c2.co_city
       OR c1.co_owner=c2.co_owner
       OR ...
     ) AND c1.id>c2.id

如果您只想复制id=22的记录,那么可以尝试使用以下方法:

代码语言:javascript
复制
SELECT c1.*
FROM
  co_name c1 INNER JOIN co_name c2
  ON c1.co_name=c2.co_name
     AND c1.id>c2.id
WHERE
  c2.id=22

或者,如果您只想要一个比较60列的双胞胎,可以尝试使用以下查询:

代码语言:javascript
复制
SELECT MIN(ID) as Twin /* or MAX(ID), depending what you're after */
FROM
  co_name c1 INNER JOIN co_name c2
  ON (
       c1.co_name=c2.co_name
       OR c1.co_city=c2.co_city
       OR c1.co_owner=c2.co_owner
       OR ...
     ) AND c1.id>c2.id
WHERE
  c2.id=22
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28643580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档