按排名和价值排序结果

时间:2016-04-14 02:51:24

标签: postgresql sql-order-by

我有以下查询,它查找最常用的应用程序,然后将消耗量增加到15,然后按顺序排序。

SELECT app, 
   srcip, 
   bandwidth 
FROM   ( 
            SELECT   app,srcip,bandwidth, 
                     rank() OVER (partition BY app ORDER BY bandwidth DESC)  AS xRank
            FROM     ( 
                              SELECT   app, 
                                       srcip, 
                                       Sum(COALESCE(sentbyte, 0)+COALESCE(rcvdbyte, 0)) AS bandwidth
                              FROM     $log 
                              WHERE    $filter 
                              AND      Logid_to_int(logid) NOT IN (4, 
                                                                   7, 
                                                                   14) 
                              GROUP BY app, 
                                       srcip 
                              HAVING   Sum(COALESCE(sentbyte, 0)+COALESCE(rcvdbyte, 0))>0
                              ORDER BY bandwidth DESC) dat) sub
WHERE  xRank < 15

此查询获取我需要但未按正确顺序排列的数据。这是我得到的一个例子。

app         srcip           bandwidth
0/0/icmp    132.245.18.194  1,080
0/0/icmp    40.96.0.98      840
0/0/icmp    40.96.0.114     600
0/0/icmp    132.245.13.210  360

但是,使用最多的应用程序是其他应用程序。

app                 srcip           bandwidth
HTTP.BROWSER_Chrome 192.168.1.241   582,191,297
HTTP.BROWSER_Chrome 192.168.1.16    495,352,897
MS.Windows.Update   192.168.1.125   415,221,314
POP3                192.168.1.160   109,979,690
HTTPS.BROWSER       192.168.1.240   96,237,582

我想首先按照使用大部分带宽的应用程序进行排序,然后将其中的15个排名。这是一个例子,但只有3个排名。

app                 srcip           bandwidth
HTTP.BROWSER_Chrome 192.168.1.241   582,191,297
HTTP.BROWSER_Chrome 192.168.1.16    495,352,897
HTTP.BROWSER_Chrome 192.168.1.16    89,369,142
MS.Windows.Update   192.168.1.125   415,221,314
MS.Windows.Update   192.168.1.160   109,979,690
MS.Windows.Update   192.168.1.240   96,237,582

我已尝试将ORDER BY带宽,xRank放在子查询中,但它没有正常工作。感谢您的帮助。

更新:我测试了@GorgonLinoff的答案,我得到的结果与第1张相同,但如果我添加DESC,我会得到以下内容。它现在被最常用的应用程序正确订购,但每个应用程序中的等级的带宽顺序仍然无序。

app                 srcip           bandwidth
HTTP.BROWSER_Chrome 192.168.1.241   582,191,297
HTTP.BROWSER_Chrome 192.168.1.101   89,369,142
HTTP.BROWSER_Chrome 192.168.1.16    495,352,897
HTTPS.BROWSER       192.168.1.12    69,579,488
HTTPS.BROWSER       192.168.1.240   96,237,582
HTTPS.BROWSER       192.168.1.241   84,061,350

1 个答案:

答案 0 :(得分:0)

我想你可能想要这样的东西。 。 。每个应用程序的前三名,应用程序按应用程序带宽排序:

SELECT app, srcip, bandwidth 
FROM (SELECT app, srcip, 
             Sum(COALESCE(sentbyte, 0)+COALESCE(rcvdbyte, 0)) AS bandwidth,
             row_number() over (partition by app order by Sum(COALESCE(sentbyte, 0)+COALESCE(rcvdbyte, 0)) desc
                               ) as xrank,
             sum(Sum(COALESCE(sentbyte, 0)+COALESCE(rcvdbyte, 0))) over (partition by app) as appbandwidth
      FROM $log 
      WHERE $filter AND logid_to_int(logid) NOT IN (4, 7, 14)
      GROUP BY app, srcip 
      HAVING Sum(COALESCE(sentbyte, 0)+COALESCE(rcvdbyte, 0)) > 0
     ) s
WHERE xrank <= 3
order by appbandwidth;