2012-02-24 49 views
1

當我想選擇作者和閱讀的書籍數量時。我會用下面的語句在SQLite中選擇具有最大未讀書籍百分比的作者

select authorid, count(authorid) 
from books 
where read = 1 
group by authorid 

當我要選擇的未讀的書籍數量對於一個給定的作者,我會在上面的語句更改10

我想選擇每個authorid比率unread/all,並從所有這些比例中選擇authoridmax(unread/all)

我可以創建這樣一個語句嗎?最大比率是1。如果有更多的authorid s,最大比例(例如ratio = 1),你可以將它們全部返回,隨機選擇或限制爲1(這並不重要)。

回答

3

要獲得所有的比例是這樣的:

select authorid, 
     SUM(case when read = 0 then 1 else 0 end)/count(authorid) as ratio 
from books b 
group by authorid 

,這將讓你擁有最大比例的:

select b.authorid, max(aux.ratio) as maxRatio 
from books b 
inner join(
    select authorid, 
      SUM(case when read = 0 then 1 else 0 end)/count(authorid) as ratio 
    from books b 
    group by authorid) aux on b.authorid = aux.authorid 
group by b.authorid 
+0

第一個陳述很好。我不知道這個有條件的計數。但第二個陳述不會只選擇最大比率。 – xralf 2012-02-24 10:55:57

+0

該解決方案是正確的。我使用'按比例排序'的第二個'select'語句的語法。 – xralf 2012-02-24 11:33:55

+1

但是在分割表達式中需要使用'cast(count(authorid)as float)'。 – xralf 2012-02-24 12:01:22

1

我不能對此進行測試ATM,但試試這個

SELECT authorid, SUM(read)/COUNT(*) 
FROM books 
GROUP BY authorid 
ORDER BY SUM(read)/COUNT(*) DESC 

這應當列出所有authorids配合比一起。

+0

這會給出錯誤的比例。檢查問題。 – 2012-02-24 10:37:36

+0

@aF。我做到了,對我來說仍然看起來像是0/1場; ) – 2012-02-24 10:42:26

+0

他想要UNREAD比率。你的'SUM(讀)'將使READ比率,因爲當作者讀這本書時讀= 1,否則爲0。得到它了? – 2012-02-24 10:46:29