2つの列を「相互参照」して、2つの情報を返すことに興味があります。
列はsaddr
、、、、daddr
です。sbytes
dbytes
それらを見つけて、次に、およびDISTINCT
saddr
と一致させたいと思います。DISTINCT
daddr
SUM
sbytes
dbytes
saddr
また、1つあたりに存在するレコードの数を簡単に見つけたいと思いますdaddr
(daddr
N個のレコードがこれに一致する場合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;