sql - 在多个表中找到最常见的值

标签 sql postgresql

给定下表,我将如何找到所有表中最常见的 ip 地址,理想情况下,该 ip 在所有表中出现的次数。

bad_guys_1         bad_guys_2
| id | ip      |   | id | ip      |
+----+---------+   +----+---------+
| 1  | 1.2.3.4 |   | 1  | 1.2.3.4 |
| 2  | 2.3.4.5 |   | 2  | 4.5.6.7 |
| 3  | 3.4.5.6 |   | 3  | 1.2.3.4 |

bad_guys_3         bad_guys_4
| id | ip      |   | id | ip      |
+----+---------+   +----+---------+
| 1  | 9.8.7.6 |   | 1  | 1.2.3.4 |
| 2  | 8.7.6.5 |   | 2  | 2.3.4.5 |
| 3  | 2.3.4.5 |   | 3  | 3.4.5.6 |

例如,查询上面的表应该得到如下结果:

| ip      | count |
+---------+-------+
| 1.2.3.4 | 4     |
| 2.3.4.5 | 3     |
| 3.4.5.6 | 2     |
| 4.5.6.7 | 1     |
| 9.8.7.6 | 1     |
| 8.7.6.5 | 1     |

真实的表格实际上包含许多额外的字段,这些字段彼此不对齐,因此是分开的表格。我真的不在乎打破比赛之间的关系,只是按计数降序列出它们会很棒。如果使用任何非标准函数会有帮助,我的数据库是 PostGreSQL,但为了可移植性,如果可能的话,我更愿意使用标准 sql。谢谢,如果您需要更多详细信息,请告诉我。

最佳答案

很抱歉,其他仅使用 union 而不是 union all 的答案是错误的。如果有一个选定的行出现在多个表中,如果其他表是通过 union 而不是 union all 包含的,则它只会被计算在第一个表中。

对于那些同时选择ID和地址的查询,仍然存在不同表中同一行ID和地址相同的可能性。使用 UNION ALL 可确保合并所有值,无论它们是否重复 - 我们需要重复项以便对它们进行计数。使用 UNION ALL 通常对数据库来说工作量较小,因为它不需要查找重复项并删除它们。

select ip, count(*) from
(
select ip from bad_guys_1
union ALL
select ip from bad_guys_2
union ALL
select ip from bad_guys_3
union ALL
select ip from bad_guys_4
) as ranking
group by ip
order by count(*) DESC

关于sql - 在多个表中找到最常见的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3522549/

相关文章:

sql - 为什么我似乎不能强制Oracle 11g为单个SQL查询消耗更多的CPU

SQL 条件连接?

php - 根据时间间隔选择行

SQL 查找不同列中的重复项

postgresql - 如何从 terraform 中 Azure 托管 PostgreSQL 的现有备份文件恢复数据库?

django - Heroku PostgreSQL Studio 找不到数据库

sql - 递归复制条目

postgresql - 如何在 Postgres 中为 UUID 主键列设置默认值?

sql - 使用单个 SQL 关联子查询获取两列

sql - 如何在 SQL 中过滤每个 id 仅具有初始行的行?