我有一个有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。
提前谢谢!
答案 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'
不是最好的,但一次取一对。它远非通用的。谢谢你指点我正确的方向。通用的解决方案会更好。