查找相等的孪生记录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'
不是最好的,但一次拿一个双胞胎。它远非通用。感谢您为我指明正确的方向。通用解决方案会更好。
我有一家 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'
不是最好的,但一次拿一个双胞胎。它远非通用。感谢您为我指明正确的方向。通用解决方案会更好。