2012-05-23 15 views
-1

我感興趣的是「交叉引用」兩列,並返回的兩條信息:GROUP BY和/或UNION是否合適?或者我應該只使用嵌套的SELECT?

的列是saddrdaddrsbytesdbytes

我想找到DISTINCTsaddrDISTINCTdaddr匹配它們,然後SUMsbytesdbytes

我也想簡單地找到每daddrsaddr存在的記錄的計數(給出的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 

我想我有最troubl e將我的頭圍繞着查詢的「他們都存在」的方面。

[EDIT2]

我已經得出結論,我只是需要花時間閱讀和獲取的GROUP BY理解和執行嵌套查詢得到我想要的信息。但是,如果任何人有任何更多的意見,將不勝感激。

[編輯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; 
+0

你問什麼更優?還是最可讀?還是最佳做法? – keyser

+0

我想我得到了關於'GROUP BY'的問題,但是我看不到'UNION'在哪裏。 –

+0

謝謝凱瑟。我並不關心可讀性,但最優方法(資源成本方面)和最佳實踐都是擔憂。您的評論意味着有幾種方法可以完成這項工作,這很好,因爲我根本不理解。 – mbrownnyc

回答

1

使用這些結構沒有什麼錯,假設他們給你你想要的結果。使用嵌套的SELECT來模擬它們會給你帶來相同或更差的性能。

我認爲你只需要這樣:

SELECT saddr, daddr, SUM(bytes) GROUP BY saddr, daddr 
+0

這是如何「...發現DISTINCT saddr和**匹配** DISTINCT daddr」。也沒有From子句? –

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。

+0

我懷疑OP正在尋找一些東西,包括類似'SELECT s.saddr,d.daddr從s.saddr = d.daddr加入',但問題不夠清楚。 –