Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
单列postgresql的组输出_Postgresql_Filter_Group By - Fatal编程技术网

单列postgresql的组输出

单列postgresql的组输出,postgresql,filter,group-by,Postgresql,Filter,Group By,首先,我是一个彻头彻尾的SQLNoob——提前感谢您提供的任何帮助 我有一个FortiAnalyzer,它使用Postgres DB存储防火墙日志。然后使用分析仪报告使用情况等 基本上,我需要编写一个自定义查询,通过每个用户前10个网站/目的地的带宽显示前10个用户 我可以从单元中获取所有相关信息,但无法正确格式化输出 我会很高兴的输出显示用户名10次与排名前10位的网站旁边的用户名。然而,头奖是在A列中只显示一次用户名,然后在B列和C列中分别显示目标地址和使用的带宽 以下是我到目前为止提出的问

首先,我是一个彻头彻尾的SQLNoob——提前感谢您提供的任何帮助

我有一个FortiAnalyzer,它使用Postgres DB存储防火墙日志。然后使用分析仪报告使用情况等

基本上,我需要编写一个自定义查询,通过每个用户前10个网站/目的地的带宽显示前10个用户

我可以从单元中获取所有相关信息,但无法正确格式化输出

我会很高兴的输出显示用户名10次与排名前10位的网站旁边的用户名。然而,头奖是在A列中只显示一次用户名,然后在B列和C列中分别显示目标地址和使用的带宽

以下是我到目前为止提出的问题:

select coalesce(nullifna(`user`), `src`) as user_src, 
coalesce(hostname, dstname, 'unknown') as web_site, 
sum(rcvd + sent)/1024 as bandwidth from $log 

where $filter and user is not null and status in ('passthrough', 'filtered') 

group by `user_src` , web_site order by user_src desc
一旦查询链接到报表图表,我就可以用x值限制输出。例如,我可以将此限制为将user_src列限制为100,即10个用户,每个用户有10个输出


我希望你明白这一点。。。如果没有,我会尽力回答任何问题。

我从网站上聚合的表开始,用户级。相比之下,要为排名前Y的网站找到排名前X的用户并不困难。您需要使用函数来获得所需的结果

样本数据:

create table test (web_site varchar, user_src varchar, bandwidth numeric);

insert into test values 
  ('a','s1',18),
  ('b','s1',12),
  ('c','s1',13),
  ('d','s2',14),
  ('e','s2',15),
  ('f','s2',16),
  ('g','s3',17),
  ('h','s3',18),              
  ('i','s3',19)
;
为排名前Y的用户获取排名前X的网站:

with cte as (
  select
    user_src,
    web_site,
    bandwidth,
    dense_rank() over(order by site_bandwidth desc) as user_rank,
    dense_rank() over(partition by user_src order by bandwidth desc) as website_rank
  from
    test
    join (select user_src, sum(bandwidth) site_bandwidth from test group by user_src) a using (user_src)
)

select 
  * 
from 
  cte
where 
  user_rank <= 2
  and website_rank <=2
order by
  user_rank,
  website_rank

给我们举个具体的例子。是一个很好的地方来建立这样的。你可以粘贴你在这里得到的链接,而无需登录。格式问题最好留给演示层处理。