2012-05-30 3 views
2

에 LIMIT (10)을 그룹화. 나는 카운트 내림차순으로 순서대로 ~ 40 partner_id 각각에 대한 상위 10 개를 표시 할 수 있도록하려면내가 쿼리가 PostgreSQL을

쿼리 결과는

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; 

나는 (당신 것 (11)보다 낮은 순위 만 항목을 유지, 그러나 트릭은 GROUP BY의 각 행 순위입니다 코드를 테스트하고 HAVING 절 결과 집합을 필터링하지 않은 그룹 당 10 개의 항목을 가져옵니다).

+0

"ERROR : ERROR : 또는 근처에서 구문 오류가 발생했습니다."(" 위치 : 99"RANK 단어 바로 다음에 있음) RANK() 함수에 익숙하지 않아서 – precose

+0

Ok, ROW_NUMBER()로 대체하려고합니다. – aleroot

+0

HAVING 절에 Window Functions가 허용되지 않으며 WHERE 절에서도 허용되지 않습니다. – precose