我有一家有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?刚刚通过了最古老的身份证?
类似于:
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。
提前谢谢你!
发布于 2015-02-21 11:16:02
我找到了一个解决方案,如果在查询中使用变量而不是硬代码,则可以处理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'不是最好的,但一次只取一个双胞胎。而且它还远不是一般的。谢谢你为我指明正确的方向。一个通用的解决方案会更好。
发布于 2015-02-21 08:56:29
选择max_co,co_name,from (选择max(co_id) max_co,min(co_id) min_co,co_name,从co_name中选择min_co=(*)>1),其中min_co=(以原来的co_id作为输入);
发布于 2015-02-21 09:20:17
您可以使用它本身加入您的表:
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;请看一个例子这里。
如果要比较多列,联接解决方案将更灵活。我不知道您希望如何比较您的列,以及如何确切地定义“孪生”行,但是这样的查询应该会有所帮助:
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=22https://stackoverflow.com/questions/28643580
复制相似问题