我感兴趣的是“交叉引用”两列并返回两条信息:
列为saddr
,daddr
,sbytes
,dbytes
。
我想找到DISTINCT
saddr
并将其与DISTINCT
daddr
匹配,然后SUM
sbytes
和{{1} }。
我还想简单地找到每dbytes
个saddr
存在的记录数(给定daddr
N条记录与此daddr
匹配。)
对于那些可能对上下文感兴趣的人,我使用名为argus的程序包及其客户端rasqlinsert来构建网络流量数据库。
谢谢,
马特
[编辑]
示例数据:
saddr
期望的结果:
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
我认为我最难以绕过查询的“它们都存在的地方”。
[EDIT2]
我的结论是,我只需要花时间阅读并理解GROUP BY并执行嵌套查询以获取我想要的信息。但是,如果有人有任何更多的意见,我们将不胜感激。
[编辑3] 解决方案:
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
返回:
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
答案 0 :(得分:1)
使用这些结构没有任何问题,假设它们可以为您提供所需的结果。使用嵌套的SELECT模拟它们会给你相同或更差的性能。
我认为你只需要这个:
SELECT saddr, daddr, SUM(bytes) GROUP BY saddr, daddr
答案 1 :(得分:0)
要做到这一点,你需要一个驾驶表和一组。 SQL无法单独使用该组生成具有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。