2012-09-08 98 views
1

我正在嘗試優化以下查詢。計數比較的查詢優化

EXPLAIN 
select clb.f_name, clb.l_name, noofbooks 
from (
    select f_name, l_name, count(*) as noofbooks from 
    customer natural join loaned_book 
    group by f_name, l_name 
) as clb 
where 3 > (
    select count(*) from (
     select f_name, l_name, count(*) as noofbooks 
     from customer natural join loaned_book 
     group by f_name, l_name 
    ) as clb1 
    where clb.noofbooks<clb1.noofbooks 
) 
order by noofbooks desc; 

本質上這個查詢試圖找到no的「前三名」(包括關係,即不限於3)。由客戶借出的書籍。 該問題與查詢中必須進行的計數量有關。 是否可以使用第一個查詢中的計數值來減少第二個查詢中的選定行而不必重新計算所有行?

這是一項家庭作業任務,所以我不期待直接的答案。任何指針將不勝感激。

+0

如果計數是「4 4 3 3 2 2 2 1」會怎麼樣? 「包括領帶的前三名」應該是「4 4 3 3」還是「4 4 3 3 2 2 2」?或者是其他東西? –

+0

嗨馬克 - 「4 4 3 3 2 2 2」在那個例子中是正確的。 – jmc

回答

1

看看dense_rank窗口函數。你想要所有密度爲3或更小的行。

+0

謝謝馬克設法讓這個工作。不勝感激! – jmc