0

長さ 50 万行、幅 10 列の CSV ファイルがあります。

2 つの特定のプロトコル (UDP と IGMP) を持つ一般的な IP アドレスを取り出し、関連付けられたプロトコルが 1 つしかない他のすべての IP アドレスを除外する必要があります。これが私のテーブルのデータの例です:

ここに画像の説明を入力

したがって、このクエリが実行され、次のように出力されます。

ここに画像の説明を入力

UDP のみを持つサーバーではなく、UDP と IGMP の両方を持つ IP/サーバーを返します。これどうやってするの?これは、約 11,000 の一意の IP を持つ 510,000 以上の回線に対して実行する必要があります。

4

3 に答える 3

1

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

select * from table where SourceIP in (プロトコル = 'IGMP' のテーブルから DestIP を選択)

これは、IGMP レコードが存在する場合、UDP も存在する必要があることを前提としています。(私は本当に安い答えではありません)

于 2015-12-05T00:59:03.363 に答える
0

ゴードンはウィンドウ関数を使用してすでに良い答えを出していると思います...別の選択肢は...

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 に答える