2012-10-09 50 views
0

我有一個「建議」表結構如下:錄取率與SQL語句

id(suggest_id) | author_id | accepted(true/false) 

我想最大的錄取率命令,例如:

Jack had 10 suggests and he accepted 5 (50% acceptance rate) 
John had 20 suggests and he accepted 5 (25% acceptance rate) 
Steve had 10 suggests and he accepted 8 (80% acceptance rate) 

這將返回:史蒂夫,傑克和約翰。

我認爲它可能必須與兩個SQL查詢,其中一個爲建議數量,第二個爲accepted=true

也許它可以完成一個查詢?

我正在使用rails,所以它也可以通過rails來完成。

回答

3

根據如何你代表接受(真/假)像...

select author_id, 
    sum(case when accepted ='true' then 1 else 0 end), 
    100.0*sum(case when accepted ='true' then 1 else 0 end)/count(*) 
from yourtable 
group by author_id 
order by 100.0*sum(case when accepted ='true' then 1 else 0 end)/count(*) desc 
+1

使用'HAVING'而不是'WHERE'來過濾聚合。例如:'HAVING count(*)> 10' – podiluska

+0

謝謝!順便說一下,GROUP BY必須在HAVING之前 –

0

你也可以嘗試使用純紅寶石:

@authors_by_acceptance_rate = Array.new 
@authors = Author.all 
@authors.each do |author| 
    @suggests = Suggest.find_by_author_id(author.id) 
     accepted = 0 
    @suggests.each do |suggest| 
    if suggest.accepted 
     accepted = accepted + 1 
    end 
    end 
    acceptance_rate = accepted/@suggests.count 
    @authors_by_acceptance_rate.push('name' => @author.name, 'accepted' =>  acceptance_rate) 
end 
return @authors_by_acceptance_rate 

我沒有測試過這,所以不能保證它的工作...