-1

2つの列を「相互参照」して、2つの情報を返すことに興味があります。

列はsaddr、、、、daddrです。sbytesdbytes

それらを見つけて、次に、およびDISTINCT saddrと一致させたいと思います。DISTINCT daddrSUMsbytesdbytes

saddrまた、1つあたりに存在するレコードの数を簡単に見つけたいと思いますdaddrdaddrN個のレコードがこれに一致する場合saddr)。

コンテキストに興味がある方のために、私はargusと呼ばれるパッケージとそのクライアントrasqlinsertを使用して、ネットワークトラフィックフローのデータベースを構築しています。

ありがとう、

マット

[編集]

サンプルデータ:

SELECT saddr,daddr,sbytes,dbytes FROM argus.argus2012K17 limit 5;

   '01:80:c2:00:00:0a', '20:fd:f1:74:36:96', 194, 0
   '01:80:c2:00:00:0a', '20:fd:f1:74:36:b6', 194, 0
   '192.168.100.11', '212.243.210.210', 120, 120
   '192.168.100.11', '212.243.210.210', 422, 3667
   '192.168.100.23', '99.248.99.240', 132, 0

望ましい結果:

saddr, daddr, how many records found where they both exist, sum of all sbytes in these records, sum of all dbytes in these records

    '01:80:c2:00:00:0a', '20:fd:f1:74:36:96', 2, 388, 0
    '192.168.100.11', '212.243.210.210', 2, 542, 3787
    '192.168.100.23', '99.248.99.240', 1, 132, 0

クエリの「両方が存在する場所」の側面に頭を悩ませるのが最も難しいと思います。

[編集2]

時間をかけてGROUPBYを読み、理解し、ネストされたクエリを実行して、必要な情報を取得する必要があると結論付けました。ただし、誰かがこれ以上入力を持っている場合は、それをいただければ幸いです。

[編集3]解決策:

SELECT saddr, daddr, SUM(sbytes), SUM(dbytes), count(saddr) FROM argus.argus2012K17 GROUP BY saddr, daddr;

戻り値:

SELECT saddr, daddr, SUM(sbytes), SUM(dbytes), count(saddr) FROM argus.argus2012K17 where saddr='01:80:c2:00:00:0a' GROUP BY saddr, daddr;
    '01:80:c2:00:00:0a', '20:fd:f1:74:36:96', 326114, 0, 1681
    '01:80:c2:00:00:0a', '20:fd:f1:74:36:b6', 326114, 0, 1681

地獄ええ。

SELECT stime, saddr, daddr, SUM(sbytes), SUM(dbytes), count(saddr) FROM argus.argus2012K17 WHERE stime BETWEEN 1337187600 AND 1337187700 GROUP BY saddr, daddr;
4

2 に答える 2

1

必要な結果が得られれば、これらの構造を使用しても問題はありません。入れ子になった SELECT でそれらをシミュレートすると、パフォーマンスが同じかそれより悪くなります。

私はあなたが単にこれを必要とすると思います:

SELECT saddr, daddr, SUM(bytes) GROUP BY saddr, daddr
于 2012-05-23T15:15:43.547 に答える
0

これを行うには、駆動テーブルとグループ化が必要です。SQL は、group by だけを使用して 0 cnt の行を生成できません。

select driver.saddr, driver.daddr, coalesce(t.sumbytes) as bytes
from (select saddr, daddr
      from (select distinct saddr from t) cross join
           (select distinct daddr from t)
     ) driver left outer join
     (select saddr, daddr, sum(byets) as sumbytes
      from t
      group by saddr, daddr
     ) as tsum
     on t.saddr = tsum.saddr and t.daddr = tsum.daddr

このステートメントは、saddr と daddr のすべての組み合わせを取得します。次に、これをバイトの合計に結合します。合計が存在しない場合、外側の選択は 0 を生成します。

于 2012-05-23T15:54:28.767 に答える