我有一个类似于netflow表的东西,并希望以这样一种方式对其进行分组,即它按(src_ip,src_port,dst_ip,dst_port)进行分组,其中可以在src和dst字段之间交换值。
| src_ip| src_port| dst_ip| dst_port| bytes_sent|
| --|--|--|--|--|
| 192.168.1.1 | 123 |192.168.10.5| 321 | 111 |
| 192.168.10.5 | 321 |192.168.1.1| 123 | 222 |
| 10.0.0.5 | 50 |172.0.0.5| 55 | 500 |
| 172.0.0.5 | 55 |10.0.0.5| 50 | 300 |
| 192.168.1.1 | 123 |192.168.10.5| 321 | 1000 |
| 192.168.1.1 | 123 |192.168.10.5| 20 | 999 |
我想从这个表中得到以下结果:
| src_ip| src_port| dst_ip| dst_port| bytes_sent| bytes_recv|
| --|--|--|--|--|--|
| 192.168.1.1 | 123 |192.168.10.5| 321 | 1111 | 222 |
| 10.0.0.5 | 50 |172.0.0.5| 55 | 500 | 300 |
| 192.168.1.1 | 123 |192.168.10.5| 20 | 999 | 0 |
基本上,试图在一行中捕获双向流量。因此,类似于按(src_ip,src_port)和(dst_ip,dst_port)分组,其中这些值可以反转。实现这一点的最佳方法是什么?
4条答案
按热度按时间anhgbhbe1#
为了决定哪个IP,端口和方向,你必须有一个规则,在你的聚合结果中,你认为谁是发送者,谁是接收者。让我们把较小的IP作为源,把较大的IP作为目的地。然后,它只是一次又一次地决定哪个原始列放在哪个结果列中的相同
CASE
表达式。一旦完成,聚合你的数据。字符串
2izufjch2#
通过组合使用以下语句GROUP BY、CASE和SUM函数来聚合函数,可以实现所需的输出
可以按如下方式执行以下查询:
字符串
上面的CASE语句将根据src和dst值的词法顺序确定它们的顺序,以确保分组在两个方向上是一致的。而SUM和CASE语句用于分别聚合不同方向(正向和反向)的bytes_sent值。
6ju8rftf3#
您可以使用self-
join
:字符串
See fiddle
lfapxunr4#
假设最小的IP是源IP,最大的是目的IP。
您可以使用
LEAST
和GREATEST
函数来确保对于最小和最大IP地址的每个组合,将选择一个条目:字符串
Demo here