首页 文章

找到平等的双记录postgresql

提问于
浏览
0

我有一个60列的 table 公司 . 目标是创建一个工具来查找,比较和消除此表中的重复项 .

示例:我有一个id为22的记录,我知道它有一个双胞胎因为我运行它(简化代码):

SELECT min(co_id),co_name,count(*) FROM co
GROUP BY co_name
HAVING count(*) > 1

结果显示有一个双胞胎(计数2),我得到最早的最小ID(co_id)

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

就像是:

SELECT co_id FROM co
WHERE co_name EQUAL TO co_id='22'
LIMIT 2

样本数据:

id    co_name
22    Volvo
23    Volvo
24    Ford
25    Ford

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

我找到的最接近的是这个 . 这远非通用 . 比较60场的噩梦:

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 .

先感谢您!

3 回答

  • 0

    选择max_co,co_name from(select max(co_id)max_co,min(co_id)min_co,co_name from co group by co_name having count(*)> 1)其中min_co =(你的旧co id作为输入);

  • 0

    你可以自己加入你的 table :

    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,您可以使用窗口函数:

    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;
    

    请参阅示例here .

    如果要比较多个列,JOIN解决方案将更加灵活 . 我不确切地知道您要如何比较列以及如何准确定义“twin”行,但是像这样的查询应该有所帮助:

    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的重复记录,那么您可以尝试使用:

    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列,您可以尝试使用此查询:

    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

    如果我在查询中使用变量而不是硬编码,我发现一个解决方案正在处理60列 . 感谢大家的所有投入 . 其中一些是关于同一轨道的 .

    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'
    

    不是最好的一个,但一次取一个双胞胎 . 它远非通用的 . 谢谢你指点我正确的方向 . 通用解决方案会更好 .

相关问题