0

次のようなpostgresqlクエリがあります。

with r as (
    select
        1 as reason_type_id,
        rarreason  as reason_id,
        count(*) over() count_all
    from 
        workorderlines 
    where 
        rarreason != 0
        and finalinsdate >= '2012-12-01'
)
select
    r.reason_id,
    rt.desc,
    count(r.reason_id) as num,
    round((count(r.reason_id)::float / (select count(*) as total from r) * 100.0)::numeric, 2) as pct
from r
    left outer join
        rtreasons as rt
    on
        r.reason_id = rt.rtreason
        and r.reason_type_id = rt.rtreasontype
group by
    r.reason_id,
    rt.desc
order by r.reason_id asc

これは、理由 ID、その理由 ID に関連付けられた説明、その理由 ID を持つエントリの数、およびその数値が表す合計の割合の 4 つの列を含む結果のテーブルを返します。

この表は次のようになります。

ここに画像の説明を入力

私がやりたいことは、理由 ID を持つエントリの総数に基づいて上位 10 件の結果のみを表示することです。ただ、余ったものは「その他」という記述で別の行にまとめたいと思います。どうすればいいですか?

4

3 に答える 3

1

上で述べたように、制限とスキップと残りの取得にはオフセットを使用します...このサイトを試してください

于 2013-02-15T16:59:06.623 に答える
1
with r2 as (
  ...everything before the select list...
  dense_rank() over(order by pct) cause_rank
  ...the rest of your query...
)
select * from r2 where cause_rank < 11
union
select 
  NULL as reason_id, 
  'Other' as desc, 
  sum(r2.num) over() as num, 
  sum(r2.pct) over() as pct,
  11 as cause_rank
from r2
where cause_rank >= 11
于 2013-02-15T17:12:27.403 に答える
0

Postgreについてはわかりませんが、SELECT TOP 10 ...を正しくソートすればうまくいくはずです

ただし、2 番目の部分については、Right Join を使用できます。TOP 10 Result をテーブル全体のデータと結合し、左側に表示されないレコードのみを使用します。それらの合計を計算すると、「残りの合計」の結果が得られます。

vw_my_top_10 は上位 10 件のレコードを表示するビューだと思います。vw_all_records は、すべてのレコード (上位 10 件を含む) を示します。

このような:

SELECT SUM(a_field)
FROM vw_my_top_10
RIGHT JOIN vw_all_records
ON (vw_my_top_10.Key = vw_all_records.Key)
WHERE vw_my_top_10.Key IS NULL
于 2013-02-15T17:13:50.687 に答える