我有一个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 回答
选择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作为输入);
你可以自己加入你的 table :
这将返回所有重复的记录(但不是具有最低id的原始记录) . 或者,因为您正在使用Postgresql,您可以使用窗口函数:
请参阅示例here .
如果要比较多个列,JOIN解决方案将更加灵活 . 我不确切地知道您要如何比较列以及如何准确定义“twin”行,但是像这样的查询应该有所帮助:
如果您只想要id = 22的重复记录,那么您可以尝试使用:
或者如果您只想要一个双胞胎,比较60列,您可以尝试使用此查询:
如果我在查询中使用变量而不是硬编码,我发现一个解决方案正在处理60列 . 感谢大家的所有投入 . 其中一些是关于同一轨道的 .
不是最好的一个,但一次取一个双胞胎 . 它远非通用的 . 谢谢你指点我正确的方向 . 通用解决方案会更好 .