如何构造涉及最大值的SQL查询?

问题描述 投票:1回答:2

我有以下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语法很弱。我无法让书架上的页面数量最多,并将其插入查询的其余部分。谢谢。

sql postgresql greatest-n-per-group
2个回答
0
投票

获得“每个书架编写最多页面的作者,对于所有具有”禁止“= 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)

0
投票

此查询同时检索每个作者和每个架子的大多数页面列表,

  • 首先,它准备了一个Author IdShelf IdNumber Pages Written的列表,通过自我联接具有相同的Author IdShelf Id但他们的Number Pages Written是不同的,
  • 然后,由Author IdShelf 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
© www.soinside.com 2019 - 2024. All rights reserved.