找到相同的双记录postgresql

时间:2015-02-21 08:02:58

标签: postgresql postgresql-9.1

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

示例:我有一个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。

提前谢谢!

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

你可以自己加入你的桌子:

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

答案 2 :(得分: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'

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