Postgresql-在另一个select语句中使用变量
作为学习psql任务的一部分,我尝试将查询优化95%。我想得到的是所有拥有与第三大借书量的人相等或更高的客户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
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进行分组?