2012-05-30 2 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

Похоже, что функции Window не допускаются в предложениях HAVING. Они также не допускаются в предложениях WHERE. – precose

Смежные вопросы