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

这将返回一个包含 4 列的结果表:原因 id、与该原因 id 关联的描述、具有该原因 id 的条目数以及该数字所代表的总数的百分比。

该表如下所示:

在此处输入图像描述

我想做的只是根据具有原因 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... 如果您正确排序应该可以解决问题

但是关于第二部分:您可以为此使用 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 回答