2

クエリがあります:

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 ごとに特定の用語のカウントが返されます。〜40のpartner_idごとにトップ10をcount desc順に表示できるようにしたい

クエリ結果は次のようになります

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)
4

1 に答える 1

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 アイテムを取得します)。

于 2012-05-30T19:50:25.417 に答える