Postgresql中的分组限制10

Postgresql中的分组限制10,postgresql,limit,Postgresql,Limit,我有一个问题: 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

我有一个问题:

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;
这将返回每个合作伙伴id的特定术语的计数。我希望能够按照计数描述的顺序显示~40个合作伙伴id中的前10个

查询结果如下所示


您可以添加排名列,然后按排名过滤结果:

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;
选择
a、 伊利,
b、 术语描述,
计数(不同的(a.adic))作为计数,
a、 合伙人身份证,
RANK()超过(按a.partner\u id划分,按a.partner\u id DESC排序)作为r
从…起
ad_delivery.sgmt_kli_adic a
在a.kli=b.term\u代码上连接wand.wandterms b
在b.term\u desc=c.term\u desc上连接wand.wandterms c
在a.partner\u id::varchar=e.partner\u id上加入dwh.sgmt\u客户端
在e.partner\u id::integer=f.partner\u id::integer上连接dwh.schema\u名称f
哪里
a、 合作伙伴id::中的整数(f.合作伙伴id)
c.class_代码=969
按a.partner\u id、b.term\u desc、a.kli分组
r<11的
按合作伙伴id订购,计数说明;

我没有测试代码,但是诀窍是按对
组的每一行进行排序,并使用
HAVING
子句过滤结果集,只保留排名低于11的项目(每组将获得10个项目)

似乎有一个错误:“error:error:syntax error at or near”(“Position:99”),就在单词RANK之后。我不熟悉RANK()函数,因此不知道如何解决此问题。好的,尝试用ROW_NUMBER()替换似乎在子句中不允许使用窗口函数。在WHERE子句中也不允许使用窗口函数。我在您的帮助下解决了这个问题。谢谢您,先生!
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;