2015-06-14 43 views
1

我有一個表與source_ip和destination_ip和用法。現在我想找到ip pair的最高使用率。 我的表是這樣的:如何在PostgreSQL中查找IP對的最高使用情況?

source_ip  | destination_ip | usage 
192.168.1.1 | 192.168.1.2 | 20 
192.168.1.2 | 192.168.1.1 | 30 
192.168.1.3 | 192.168.1.2 | 20 
192.168.1.2 | 192.168.1.3 | 20 

例如,這兩條記錄是一對。

source_ip | destination_ip | usage 
192.168.1.1 | 192.168.1.2 | 20 
192.168.1.2 | 192.168.1.1 | 30 

最後我想這

192.168.1.1 and 192.168.1.2 used 50 b 
192.168.1.2 and 192.168.1.3 used 40 b 

這是我的查詢,

with T1 as(
    SELECT source_ip, distination_ip, sum(usage) 
    FROM receiver 
    GROUP BY source_ip, distination_ip 
) 
SELECT DISTINCT * FROM T1 JOIN T1 T2 
ON T1.source_ip = T2.distination_ip AND T1.distination_ip = T2.source_ip 

和我的查詢返回此:

source_ip  | destination_ip | usage | source_ip  | destination_ip | usage 
192.168.1.1 | 192.168.1.2 | 20 | 192.168.1.2 | 192.168.1.1 | 30 
192.168.1.2 | 192.168.1.1 | 30 | 192.168.1.1 | 192.168.1.2 | 20 
192.168.1.3 | 192.168.1.2 | 20 | 192.168.1.2 | 192.168.1.3 | 20 
192.168.1.2 | 192.168.1.3 | 20 | 192.168.1.3 | 192.168.1.2 | 20 

回答

3

你可以做出一個任意的決定來表示「較小」的IP地址第一和「較大」的第二。從那裏,這是一個簡單的group bysum

WITH t1 AS (
    SELECT LEAST(source_ip, distination_ip) AS ip1, 
      GREATEST(source_ip, distination_ip) AS ip2 , 
      usage 
    FROM receiver 
) 
SELECT ip1, ip2, SUM(usage) 
FROM  t1 
GROUP BY ip1, ip2 

或者,如果你想要的結果格式化查詢本身:

WITH t1 AS (
    SELECT LEAST(source_ip, distination_ip) AS ip1, 
      GREATEST(source_ip, distination_ip) AS ip2 , 
      usage 
    FROM receiver 
) 
SELECT ip1 || ' and ' || ip2 || ' used ' || SUM(usage) || ' b' 
FROM  t1 
GROUP BY ip1, ip2 
+0

謝謝。它現在看起來很簡單,在你的答案之後;) –

2

使用派生表「排序」的IP地址。它的結果是GROUP BYSUM

select ip1, ip2, sum(usage) 
from 
(
select case when source_ip < destination_ip then source_ip else destination_ip end ip1, 
     case when source_ip > destination_ip then source_ip else destination_ip end ip2, 
     usage 
from receiver 
) 
group by ip1, ip2 
相關問題