2015-09-27 45 views
0

请注意,我刚刚开始学习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年发布书籍最受欢迎(9份,分别采取的书,我发布n 2006)。

+0

您需要定义如何打破关系:如果您碰巧得到多于一个的最大计数,应选择哪一年? –

回答

2

使用order bylimit 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; 

注:请不要使用distinctgroup 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语法。

+0

对于这个特定的练习,我不能使用像LIMIT这样的非标准函数......但是,谢谢你,这个例子有助于更好地理解它。 – Pa2k3l1s

+1

然后使用ANSI标准'FETCH FIRST 1 ROW ONLY'。 Postgres也支持这一点。 (我认为人们倾向于选择'LIMIT',因为它更容易打字。) –

+0

谢谢你的帮助! – Pa2k3l1s

0

您应该使用适当的连接语法,而不是在where子句中声明join条件。

这样做的一种方法是使用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) 
+0

非常感谢!奇迹般有效 :) – Pa2k3l1s

相关问题