Оператор SQL для возврата IP-адресов с двумя конкретными протоколами

У меня есть CSV-файл длиной чуть более полумиллиона строк и шириной в десять столбцов.

Мне нужно извлечь общие IP-адреса, которые имеют два конкретных протокола (UDP и IGMP) и отфильтровать все другие IP-адреса, которые имеют только один связанный протокол. Вот пример данных в моей таблице:

Итак, этот запрос будет запущен и выведет:

Он возвращает IP/ сервер, который имеет ОБА UDP и IGMP, а НЕ сервер, который имеет только UDP. Как я могу это сделать? Это должно быть выполнено против 510 000+ линий с около 11 000 уникальных IP-адресов.

3 ответа

Одним из методов является использование оконных функций:

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'),

Выберите * из таблицы, где находится SourceIP (выберите DestIP из таблицы, где Protocol = 'IGMP')

Это предполагает, что если запись IGMP существует, то UDP также должен существовать. (Я не очень дешевый ответ)

Я считаю, что Гордон уже дал хороший ответ, используя оконные функции... Другой альтернативой может быть...

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

)

Примечание: я еще не запускал этот запрос...

Другие вопросы по тегам