【问题标题】:Select the max value along with a corresponding title?选择最大值以及相应的标题?
【发布时间】:2020-07-24 14:24:51
【问题描述】:

我有两个表是这样创建和填充的:

create table booklist(title varchar(20), bookid char(2) PRIMARY KEY);
create table numberofcopies (bookid char(2) FOREIGN KEY REFERENCES booklist(bookid), numcopies int);

insert into booklist VALUES ('book 1', 1), ('book 2', 2);
insert into numberofcopies VALUES (1, 5), (2, 10);

我要做的是从id#2 中获取最大值,在本例中为“10”,然后说出相应的标题“书 2”。我的查询返回的是所有书籍的列表,而不仅仅是具有最大值的书籍。我该怎么做呢?到目前为止我的 SQL 查询:

SELECT MAX(numCopies), title AS Title
FROM numberofcopies JOIN booklist ON numberofcopies.bookid=booklist.bookid
GROUP BY Title;

【问题讨论】:

    标签: sql sql-server tsql group-by greatest-n-per-group


    【解决方案1】:

    如果你想要一本最多的书,你可以加入、订购和限制:

    select top (1) bl.*, noc.numcopies
    from booklist bl
    inner join numberofcopies noc on noc.bookid = bl.bookid
    order by noc.numcopies desc
    

    如果您想允许排名靠前,您可以改用top (1) with ties


    编辑:如果您确实想要max(),一种方法是加入,然后使用从numberofcopies 获得最大numcopies 的相关子查询进行过滤.

    select bl.*, noc.numberofcopies
    from booklist bl
    inner join numberofcopies noc on noc.bookid = bl.bookid
    where noc.numcopies = (select max(numcopies) from numberofcopies)
    

    请注意,这需要在numberofcopies 上再扫描一次,所以这确实比第一个解决方案效率低。

    【讨论】:

    • 可以用 max 子句做我想做的事吗?这部分是任务要我做的。
    • @howimetmyself:使用max() 会更加复杂,不会增加任何价值。据我了解您的问题,top 1 确实是正确的方法。但是,好的,我在答案中添加了另一个查询。
    【解决方案2】:

    你可以在GROUP BY子句之后添加:

    ORDER BY numCopies DESC
    LIMIT 1;
    

    查询将从最大到最小对值进行排序。将结果限制为 1,您将获得 MAX 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 2012-10-08
      • 2017-01-22
      相关资源
      最近更新 更多