首页 > 解决方案 > SQL Top 5 和其他的

问题描述

我想选择前 5 行和另外一个名为 Others 的第 6 行,并聚合其余部分。

使用 Anzahl 作为 (SELECT NVL (parse_listener_log_line (connect_string, 'HOST'), 'n/a') host, COUNT(*) cnt FROM listener_log WHERE ID_MANDANT = :P100_MANDANT AND ID_SERVER = :P100_SERVER GROUP BY parse_listener_log_line (connect_string, 'HOST') ) ORDER BY cnt DESC), client as (select case when rownum > 4 then 'Others' else host end as client, cnt FROM Anzahl) SELECT client, cnt FROM client;

客户端 CNT jdbc 118553 server2 106170 server1 101710 server4 13370 其他 8734 其他 1760 其他 1365 其他 1058

标签: oracle

解决方案


一些分析函数 ( row_number) 以及集合操作 ( union) 可能会满足您的需求。

Scott 的 EMP 表包含以下数据:

SQL> select ename, sal from emp order by sal desc;

ENAME             SAL
---------- ----------
KING             5000
FORD             3000
SCOTT            3000
JONES            2975
BLAKE            2850
CLARK            2450
ALLEN            1600
TURNER           1500
MILLER           1300
WARD             1250
MARTIN           1250
ADAMS            1100
JAMES             950
SMITH             800

14 rows selected.

现在:找到每一行的序数(使用row_number)并将前 5 行(将它们中的每一行都按原样)与包含汇总工资的第六行合并:

SQL> with temp as
  2    (select ename,
  3            sal,
  4            row_number() over (order by sal desc) rn
  5     from emp
  6    )
  7  select rn,
  8         ename,
  9         sal
 10  from temp
 11  where rn <= 5
 12  union all
 13  select 6,
 14         'Other',
 15         sum(sal)
 16  from temp
 17  where rn > 5
 18  order by rn;

        RN ENAME             SAL
---------- ---------- ----------
         1 KING             5000
         2 SCOTT            3000
         3 FORD             3000
         4 JONES            2975
         5 BLAKE            2850
         6 Other           12200

6 rows selected.

SQL>

推荐阅读