2012-05-30 30 views
2

我有一個查詢:分組LIMIT 10在PostgreSQL

select 
    a.kli, 
    b.term_desc, 
    count(distinct(a.adic)) as count, 
    a.partner_id 

from 
    ad_delivery.sgmt_kli_adic a 
    join wand.wandterms b on a.kli = b.term_code 
    join wand.wandterms c on b.term_desc=c.term_desc 
    join dwh.sgmt_clients e on a.partner_id::varchar = e.partner_id 
    join dwh.schema_names f on e.partner_id::integer = f.partner_id::integer 
where 
    a.partner_id::integer in (f.partner_id) 
    and c.class_code = 969 
group by a.partner_id, b.term_desc, a.kli 
order by partner_id, count desc; 

其帶回每PARTNER_ID某些條款計數。我希望能夠通過計數遞減到顯示前10個每個〜40 PARTNER_ID,以便

查詢結果看起來像

db=# SELECT * FROM xxx; 
pid | term_desc | count 
----+------------+------ 
    4 | termdesc1 | 3434 
    4 | termdesc2 | 235 
    4 | termdesc3 | 367 
    4 | termdesc4 | 4533 
    5 | termdesc1 | 235 
    5 | termdesc2 | 567 
    5 | termdesc3 | 344 
    5 | termdesc4 | 56 
(10k+ rows) 

回答

2

你可以添加一個排名列,然後過濾結果由排名:

select 
    a.kli, 
    b.term_desc, 
    count(distinct(a.adic)) as count, 
    a.partner_id, 
    RANK() OVER (PARTITION BY a.partner_id order by a.partner_id DESC) AS r 
from 
    ad_delivery.sgmt_kli_adic a 
    join wand.wandterms b on a.kli = b.term_code 
    join wand.wandterms c on b.term_desc=c.term_desc 
    join dwh.sgmt_clients e on a.partner_id::varchar = e.partner_id 
    join dwh.schema_names f on e.partner_id::integer = f.partner_id::integer 
where 
    a.partner_id::integer in (f.partner_id) 
    and c.class_code = 969 
group by a.partner_id, b.term_desc, a.kli 
HAVING r < 11 
order by partner_id, count desc; 

我沒有測試的代碼,但訣竅是排名GROUP BY的每一行和過濾與HAVING子句中的結果,只保留項目比11低等級(你會每組獲得10個項目)。

+0

它看起來有一個錯誤:「錯誤:錯誤:語法錯誤在或接近」(「 位置:99」這是正確的後面的單詞RANK。我不熟悉RANK()函數,所以我不不知道如何去解決這個問題 – precose

+0

好吧,試着用ROW_NUMBER()代替 – aleroot

+0

HAVING子句中不允許使用Window函數,它們也不允許在WHERE子句中使用 – precose