Postgresql 按等级和值对结果排序
我有下面的查询,它看起来是最常用的应用程序,然后将消耗量最多的应用程序排名为15,然后按它排序Postgresql 按等级和值对结果排序,postgresql,sql-order-by,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,
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
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
我曾尝试在子查询中按带宽、xRank排序,但没有正常工作。提前谢谢你的帮助
更新:我测试了@GorgonLinoff的答案,结果与第一次发布的结果相同,但如果我添加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
我想你可能想要这样的东西。每个应用程序的前三名,应用程序按应用程序总带宽排序:
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;
选择应用程序、SRIP、带宽
从(选择应用程序、SRIP、,
和(合并(sentbyte,0)+合并(rcvdbyte,0))作为带宽,
(按应用程序顺序按和(合并(sentbyte,0)+合并(rcvdbyte,0))描述上的行数()
)作为xrank,
sum(sum(合并(sentbyte,0)+合并(rcvdbyte,0)))作为appbandwidth(按应用划分)
从$log
其中$filter和logid_to_int(logid)不在(4,7,14)中
按应用分组,srcip
具有和(合并(sentbyte,0)+合并(rcvdbyte,0))>0的
)
在外部查询中,orderbybandwidth
如何?如果你想在下一步添加它WHERE xrank<15
我得到我在问题上添加的第二个结果。我想我最好将结果添加到我的问题中。。。我无法在答案上正确地编排格式。
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;