Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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-在另一个select语句中使用变量_Sql_Postgresql_Query Optimization - Fatal编程技术网

Postgresql-在另一个select语句中使用变量

Postgresql-在另一个select语句中使用变量,sql,postgresql,query-optimization,Sql,Postgresql,Query Optimization,作为学习psql任务的一部分,我尝试将查询优化95%。我想得到的是所有拥有与第三大借书量的人相等或更高的客户 explain analyze select clb.f_name, clb.l_name, noofbooks from (select f_name, l_name, count(*) as noofbooks from customer left join loaned_book on customer.customerid = loaned_book

作为学习psql任务的一部分,我尝试将查询优化95%。我想得到的是所有拥有与第三大借书量的人相等或更高的客户

explain analyze
select clb.f_name, clb.l_name, noofbooks 
from 
      (select f_name, l_name, count(*) as noofbooks 
      from customer left join loaned_book on customer.customerid = loaned_book.customerid 
      group by f_name, l_name) as clb,
      (select f_name as fname, l_name as lname, count(*) as noofbooksf 
      from customer left join loaned_book on customer.customerid = loaned_book.customerid
      group by fname, lname order by noofbooksf  desc  LIMIT 1 OFFSET 2) as clb1
where noofbooks  >= noofbooksf 
order by noofbooks desc; 
这就是我到目前为止所做的,它被优化到80度,但是两个连接增加了成本。因此,我想做的只是做一次连接。然后使用结果得到它的第三个元素。我曾想过创建一个临时视图,但我相信会有更好的方法


谢谢。

如果你想要借书最多或借书第二的人,那么只需:

select c.f_name, c.l_name, count(lb.customerid) as noofbooks 
from customer c left join
     loaned_book lb
     on c.customerid = lb.customerid 
group by c.f_name, c.l_name
order by noofbooks desc
limit 3;
如果您关心领带:

select f_name, l_name, noofbooks
from (select c.f_name, c.l_name, count(lb.customerid) as noofbooks,
             rank() over (order by noofbooks desc) as seqnum
      from customer c left join
           loaned_book lb
           on c.customerid = lb.customerid 
      group by c.f_name, c.l_name
     ) clb
where seqnum <= 3;

等于或大于什么?例如,借书量排在第三位的人借了4本书。我们希望每个人都有4本或4本以上的借书。为什么要按f_名称、l_名称而不是客户ID进行分组?