我有以下psql表与以下列:
Library:
library_id
Shelf:
shelf_id
library_id (Library foreign key)
forbidden = (boolean)
Author
author_id
shelf_id (Shelf foreign key)
number_pages_witten
Book
book_id
author_id (Author foreign key)
book_name
我需要一个检索以下内容的查询:
对于library_id = 5,获取已写入每个书架最多页面的作者的书名列表,对于所有具有“禁止”= False的书架
到目前为止我有以下内容:
SELECT name FROM Book AS b
INNER JOIN Author AS a
ON b.author_id = a.author_id
...
...
WHERE library_id=5
我的sql语法很弱。我无法让书架上的页面数量最多,并将其插入查询的其余部分。谢谢。
获得“每个书架编写最多页面的作者,对于所有具有”禁止“= False”的书架的要求是rank()
窗口功能的经典用例。从那以后,你只需要一个内部查询:
SELECT name
FROM book b
WHERE b.author_id IN (SELECT author_id
FROM (SELECT a.author_id,
RANK() OVER
(PARTITION BY a.shelf_id
ORDER BY number_pages_written DESC) rk
FROM author a
JOIN shelf s ON a.shelf_id = a.shelf_id
WHERE library_id = 5)
WHERE rk = 1)
此查询同时检索每个作者和每个架子的大多数页面列表,
Author Id
,Shelf Id
和Number Pages Written
的列表,通过自我联接具有相同的Author Id
和Shelf Id
但他们的Number Pages Written
是不同的,Author Id
和Shelf Id
分组我希望它对您的问题和所有相关问题都有所帮助
select author_id1, shelf_id1, max(num_pages1)
(
select
Author1.author_id author_id1, Author1.shelf_id shelf_id1, Author1.number_pages_witten num_pages1,
Author2.author_id author_id2, Author2.shelf_id shelf_id2, Author2.number_pages_witten num_pages2
from Author Author1 left join Author Author2
on Author1.author_id = Author2.author_id and Author1.shelf_id = Author2.shelf_id
and Author1.number_pages_witten != Author2.number_pages_witten
)ds
group by author_id1, shelf_id1