0

我有一个 CSV 文件,该文件长约 50 万行,宽 10 列。

我需要取出具有两种特定协议(UDP 和 IGMP)的常见 IP 地址,并过滤掉只有一种关联协议的所有其他 IP 地址。这是我表中数据的示例:

在此处输入图像描述

因此,此查询将运行并输出:

在此处输入图像描述

它返回同时具有 UDP 和 IGMP 的 IP/服务器,而不是仅具有 UDP 的服务器。我怎样才能做到这一点?这需要针对 510,000 多条线路和大约 11,000 个唯一 IP 运行。

4

3 回答 3

1

一种方法是使用窗口函数:

select t.*
from (select t.*,
             sum(case when protocol = 'UDP' then 1 else 0 end) over (partition by sourceIP) as num_udp,
             sum(case when protocol = 'IGMP' then 1 else 0 end) over (partition by sourceIP) as num_igmp
      from table t
     ) t
where num_udp > 0 and num_igmp > 0;

编辑:

如果您只想要这些协议:

select t.*
from (select t.*,
             sum(case when protocol = 'UDP' then 1 else 0 end) over (partition by sourceIP) as num_udp,
             sum(case when protocol = 'IGMP' then 1 else 0 end) over (partition by sourceIP) as num_igmp,
             sum(case when protocol not in ('UDP', 'IGMP') then 1 else 0 end) over (partition by sourceIP) as num_other
      from table t
     ) t
where num_udp > 0 and num_igmp > 0 and num_other = 0;

如果您只想过滤协议,请添加where protocol in ('UDP', 'IGMP').

于 2015-12-05T01:00:01.257 回答
0

我相信 Gordon 已经使用窗口函数给出了一个很好的答案......另一种选择可能是......

Select * from [tablename]
where SourceIP in
(

Select t2.SourceIP,count(SourceIP) from 
    (
      Select SourceIP,Protocol,count(*) from [tablename] where Protocol in ('UDP','IGMP') group by SourceIP,Protocol
    ) as t2 
group by SourceIP having count(SourceIP)=2

)

注意:我还没有运行这个查询...

于 2015-12-05T01:14:48.083 回答
0

select * from table where SourceIP in (select DestIP from table where Protocol = 'IGMP')

这假设如果 IGMP 记录存在,那么 UDP 也必须存在。(我真的不是一个便宜的答案)

于 2015-12-05T00:59:03.363 回答