我有一个 CSV 文件,该文件长约 50 万行,宽 10 列。
我需要取出具有两种特定协议(UDP 和 IGMP)的常见 IP 地址,并过滤掉只有一种关联协议的所有其他 IP 地址。这是我表中数据的示例:
因此,此查询将运行并输出:
它返回同时具有 UDP 和 IGMP 的 IP/服务器,而不是仅具有 UDP 的服务器。我怎样才能做到这一点?这需要针对 510,000 多条线路和大约 11,000 个唯一 IP 运行。
我有一个 CSV 文件,该文件长约 50 万行,宽 10 列。
我需要取出具有两种特定协议(UDP 和 IGMP)的常见 IP 地址,并过滤掉只有一种关联协议的所有其他 IP 地址。这是我表中数据的示例:
因此,此查询将运行并输出:
它返回同时具有 UDP 和 IGMP 的 IP/服务器,而不是仅具有 UDP 的服务器。我怎样才能做到这一点?这需要针对 510,000 多条线路和大约 11,000 个唯一 IP 运行。
一种方法是使用窗口函数:
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')
.
我相信 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
)
注意:我还没有运行这个查询...
select * from table where SourceIP in (select DestIP from table where Protocol = 'IGMP')
这假设如果 IGMP 记录存在,那么 UDP 也必须存在。(我真的不是一个便宜的答案)