注意,我刚开始学习PostgreSQL大学,英语不是我的母语。
我需要找到发行图书最受欢迎的年份(拍摄大部分版本时发行的图书年份)。
在这里,我发布了三年的书籍和所拍摄的副本数量:
Select distinct book.year, count(copy.nr)
From stud.book, stud.copy
Where copy.taken is not null and book.isbn=copy.isbn
Group by book.year;
这就是我得到的:
year | count
------+-------
2007 | 2
2006 | 9
2005 | 5
(3 rows)
这就是我真正需要的:
year | count
------+-------
2006 | 9
因为2006年发行的书籍最受欢迎(2006年发行了9本书)。
答案 0 :(得分:2)
使用order by
和limit 1
:
Select book.year, count(copy.nr) as cnt
From stud.book, stud.copy
Where copy.taken is not null and book.isbn=copy.isbn
Group by book.year
Order by cnt desc
Limit 1;
注意:除非您确实知道自己在做什么,否则不要将distinct
与group by
一起使用。此外,表别名和显式join
语法使这样的查询更容易编写和阅读:
Select b.year, count(c.nr) as cnt
From stud.book b join
stud.copy c
on b.isbn = c.isbn
Where c.taken is not null
Group by b.year
Order by cnt desc
Limit 1;
一个简单的规则:从不在from
子句中使用逗号; 始终使用显式join
语法。
答案 1 :(得分:0)
您应该使用适当的连接语法,而不是在join
子句中声明where
条件。
执行此操作的一种方法是使用cte
。
with counts as (
select book.year, count(copy.nr) as cnt
from stud.book join stud.copy
on book.isbn=copy.isbn
where copy.taken is not null
group by book.year )
select * from counts
where cnt = (select max(cnt) as maxcnt from counts)