查找相等的孪生记录postgresql

Find equal twin record postgresql

我有一家 table 公司,有 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?只传递最旧的 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.

提前致谢!

select max_co,co_name 来自 ( select max(co_id) max_co,min(co_id) min_co,co_name 来自 co 按 co_name 计数 (*)>1) 分组,其中 min_co=(您的旧代码作为输入);

您可以加​​入您的 table 自身:

SELECT c1.*
FROM
  co_name c1 INNER JOIN co_name c2
  ON c1.co_name=c2.co_name
     AND c1.id>c2.id

这将 return 所有重复的记录(但不是具有最低 ID 的原始记录)。或者因为你使用的是 Postgresql,你可以使用 window 函数:

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

如果我在查询中使用变量而不是硬编码,我发现了一个适用于 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'

不是最好的,但一次拿一个双胞胎。它远非通用。感谢您为我指明正确的方向。通用解决方案会更好。