2016-05-29 84 views
1

我有图书馆的数据库,我想最借来标题分配给每个像今年ORACLE SQL选择MAX(COUNT()),以一年

2015 - The Great Gatsby 
2014 - Da vinci code 
2013 - Harry Potter 
.... 

我已经试过这,但我不知道它

select to_char(borrow_date,'YYYY'),title_name 
from k_title 
join k_book 
using(title_id) 
join k_rent_books 
using(book_id) 
group by to_char(borrow_date,'YYYY'),title_name 
having count(title_id) = (
select max(cnt) FROM(select count(title_name) as cnt 
from k_title 
join k_book 
using(title_id) 
join k_rent_books 
using(book_id) 
group by title_id,title_name,to_char(borrow_date,'YYYY'))); 

我只拿到了3个结果

2016 - Shogun 
2006 - The Revolt of Mamie Stover 
1996 - The Great Gatsby 

我会很高兴的任何帮助:)

回答

1

Oracle有很好的能力获得聚合中的第一个或最后一个值(而不是min()max())。这需要使用称为keep的东西。

所以,来表达你想要做什么的方法是:

select yyyy, 
     max(title_name) keep (dense_rank first order by cnt desc) as title_name 
from (select to_char(borrow_date, 'YYYY') as yyyy, 
      title_name, count(*) as cnt 
     from k_title t join 
      k_book b 
      using (title_id) join 
      k_rent_books 
      using (book_id) 
     group by to_char(borrow_date, 'YYYY'), title_name 
    ) yt 
group by yyyy; 

您的查询返回拥有了所有年份的整体最大计数,而不是每年最高年/标题组合。