统计SQL中的重复项
作为数据库管理员,您可能会遇到需要确定给定表列中的重复值的实例。这在需要清理包含不同值的表时特别有用。
在给定的表中可能出现重复的实例有很多。这可以包括自动导入和缺少表中的约束。幸运的是,我们有各种工具和技术来确定表列中的重复值。
在本教程中,我们将探讨可用于获取表列中重复值的数量的各种方法和技术。
样本数据
在深入研究各种方法和技术之前,让我们先用样例数据设置一个基本表,以便演示计算表中重复项的技术。
在我们的例子中,我们创建了一个基本表来存储网络信息,如下面的查询所示:
创建表network_info
id INT主键;
主机名VARCHAR (255),
ip_address VARCHAR (15)
);
INSERT INTO network_info (id, hostname, ip_address)
值
(1, 'server1', '192.168.1.1'),
(2, 'server2', '192.168.1.2'),
(3, 'server3', '192.168.1.3'),
(4, 'server4', '192.168.1.4'),
(5, 'server1', '192.168.1.1'),
(6, 'server6', '192.168.1.6'),
(7, 'server7', '192.168.1.7');
在本例中,我们存储各种服务器的主机名和关联的IP地址。
方法一:使用GROUP BY和HAVING子句
我们可以使用的方法之一是组合GROUP BY和HAVING子句。查询根据指定的列对记录进行分组,然后过滤计数大于1的组(实际上是重复值)。
示例如下:
SELECT hostname, ip_address, COUNT(*) AS duplicate_count
从network_info
按主机名,ip_address分组
count (*) > 1;
这将返回重复记录和表中重复记录的数量。
使用示例输出如下:
主机名| ip_address | duplicate_count |
--------+-----------+---------------+
Server1 |192.168.1.1| 2|
方法2:使用Window Function
在SQL中,我们还可以访问窗口函数,例如COUNT和OVER子句,我们可以使用它们来确定窗口函数的重复值的数量。
示例如下:
SELECT id, hostname, ip_address,
COUNT(*) OVER (PARTITION BY hostname, ip_address)作为duplicate_count
从network_info;
这种技术利用COUNT()函数作为窗口函数,根据主机名和IP地址对数据进行分区。然后,我们计算每行的重复项。结果输出如下:
id |主机名| ip_address | duplicate_count |
--+--------+-----------+---------------+
1|server1 |192.168.1.1| 2|
5|server1 |192.168.1.1| 2|
2|server2 |192.168.1.2| 1|
3|server3 |192.168.1.3| 1|
4|server4 |192.168.1.4| 1|
6|server6 |192.168.1.6| 1|
7|server7 |192.168.1.7| 1|
方法3:使用公共表表达式(CTE)
SQL数据库中的另一个特性是公共表表达式,通常称为cte。
公共表表达式是SQL中的一个基本特性,它允许我们在SQL语句中创建临时结果集。它们通过将复杂查询分解成更小的子查询,在简化复杂查询方面发挥了至关重要的作用。
我们可以使用CTE计算表中的重复值,如下例所示:
SELECT n.id, n.hostname, n.ip_address, cte.duplicate_count
FROM network_info n
JOIN duplicate(重复
ON n.hostname = cte。hostname AND n.p ip_address = cte.ip_address;
在本例中,我们创建一个CTE来计算重复次数,然后将其与原始表连接以检索重复次数。
结果输出如下:
id |主机名| ip_address | duplicate_count |
--+--------+-----------+---------------+
5|server1 |192.168.1.1| 2|
1|server1 |192.168.1.1| 2|
好了!
结论
在这篇文章中,你可以看到如何计算在查询的结果集中有多少个值有重复或相等的值。