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

时间:2017-06-12 05:29:16

标签: sql postgresql greatest-n-per-group

我有以下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,获取每个书架编写最多页面的作者的书名列表,对于所有具有"禁止" =假

到目前为止,我有以下内容:

SELECT name FROM Book AS b 
INNER JOIN Author AS a
ON b.author_id = a.author_id
...
...
WHERE library_id=5

我的sql语法非常弱。我无法在书架上找到包含最多页面数量的作者,并将其插入查询的其余部分。谢谢。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

此查询同时检索每个作者和每个书架的大部分图书清单

  • 首先,它通过具有相同的 generateBubbleNames(nodes){ var maxCharacters = 10; var labels = nodes.selectAll("text.label") .data(function(d) { return [d]; }); labels.enter().append("text") .attr({ "class": "label", dy: "0.35em" }) .style("text-anchor", "middle") .style("font-size", function(d) { return d.r / 3; }) .text(function(d) { return d[0] }) .on("mousedown", function(){ d3.event.stopPropagation(); }) } Author Id但它们各自相同的自联接来准备Shelf IdNumber Pages WrittenAuthor Id的列表Shelf Id不同,
  • 然后,按Number Pages WrittenAuthor Id分组

希望对您的问题和所有相关问题都有用

Shelf Id