【问题标题】:Sqlite - Count Unique Values based on ColumnSqlite - 根据列计算唯一值
【发布时间】:2015-06-13 15:24:03
【问题描述】:

我有一张这样的表(C,Sqlite)。我想计算每个 IP 地址联系的 unique 端口的数量。

id | ip_src       | ip_dst | port 
-----------------------------------
1  | 192.168.45.3 | ...    | 442
2  | 132.43.13.4  | ...    | 42
3  | 111.5.34.3   | ...    | 80
4  | 54.2.2.1     | ...    | 8322
5  | 54.2.2.1     | ...    | 8322
6  | 192.168.45.3 | ...    | 80
7  | 192.168.45.3 | ...    | 23

查询的结果理想情况下应该是这样的:

192.168.45.3 = 3
132.43.13.4 = 1
111.5.34.3 = 1
54.2.2.1 = 1

查询会是什么样子?

我试过了:

SELECT src_ip, COUNT(DISTINCT port) FROM synpackets;

但它没有给出正确的结果,它似乎只计算第一个 IP 地址。

【问题讨论】:

  • SO 的重点不是为您编写代码 - 重点是解决您编写的代码中的问题。因此,尝试一些方法,如果它不起作用,您可以寻求帮助以解决您提交的问题。
  • 这不是编码服务。发布到目前为止您尝试过的代码。
  • 你得到了什么结果?您可能需要在查询末尾添加一个分组依据:GROUP BY src_ip。
  • 它只给我一个 IP 地址的计数,而且它似乎同时计算了源 IP 字段和目标 IP 字段
  • 如果你把 group by 子句放在上面会发生什么?

标签: c++ mysql sqlite


【解决方案1】:

这样的东西应该可以工作

SELECT src_ip, COUNT(*) FROM synpackets group by src_ip, port;

【讨论】:

  • port 分组将给出不同的计数 per 端口;按src_ip 分组就足够了。尽管他们可能也需要COUNT(DISTINCT port),但前提是 SQLite 支持。
  • 确实如此,但该查询将给出作为示例给出的结果,192.168.45.3 = 3 132.43.13.4 = 1 111.5.34.3 = 1 54.2.2.1 = 1
【解决方案2】:

首先获得唯一端口很重要。因此,您必须像这样嵌套两个 select 语句:

SELECT T.ip_src AS ip_src, 
Count(T.ports) AS numberPorts 
FROM (SELECT DISTINCT ip_src, ports FROM <TABLE>) AS T 
GROUP BY T.ip_src;

在内部选择语句中,结果都是唯一的 ip_src 和端口对。使用这个记录集,我们可以计算端口。请注意GROUP BY。 否则我们将无法获得唯一端口数。

【讨论】:

  • 什么是“T”。你说“AS T GROUP”的地方和地方?
  • T. 指的是内部 SELECT 语句的“新”名称。 AS T 将内部 SELECT 语句重命名为 T。它可能在不重命名的情况下工作,但对于更大和多个嵌套语句,它更具可读性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 2021-03-16
  • 2023-01-03
  • 1970-01-01
  • 2021-05-07
  • 2020-10-09
  • 1970-01-01
相关资源
最近更新 更多