您的位置:首页 > 数据库 > Oracle

Oracle 定长范围分组统计

2013-11-21 13:20 232 查看
WITH T AS (

SELECT 1 as N FROM DUAL UNION ALL

SELECT 3 N FROM DUAL UNION ALL

SELECT 4 N FROM DUAL UNION ALL

SELECT 7 N FROM DUAL UNION ALL

SELECT 10 N FROM DUAL UNION ALL

SELECT 11 N FROM DUAL UNION ALL

SELECT 12 N FROM DUAL UNION ALL

SELECT 12 N FROM DUAL UNION ALL

SELECT 19 N FROM DUAL UNION ALL

SELECT 20 N FROM DUAL

)

select n, row_number() over(order by n) rn from T;

N RN

------- ----------

1 1

3 2

4 3

7 4

10 5

11 6

12 7

12 8

19 9

20 10

WITH T AS (

SELECT 1 N FROM DUAL UNION ALL

SELECT 3 N FROM DUAL UNION ALL

SELECT 4 N FROM DUAL UNION ALL

SELECT 7 N FROM DUAL UNION ALL

SELECT 10 N FROM DUAL UNION ALL

SELECT 11 N FROM DUAL UNION ALL

SELECT 12 N FROM DUAL UNION ALL

SELECT 12 N FROM DUAL UNION ALL

SELECT 19 N FROM DUAL UNION ALL

SELECT 20 N FROM DUAL

),v as (

select n, row_number() over(order by n) rn from t

),v1 (flag,n,rn) as (

select n,n,rn from v where rn = 1

union all

select case when v.n - v1.flag >= 5 then v.n else v1.flag end,

v.n,

v.rn

from v, v1

where v.rn = v1.rn + 1

)

select * from v1;

FLAG N RN

-------- ---------- ----------

1 1 1

1 3 2

1 4 3

7 7 4

7 10 5

7 11 6

12 12 7

12 12 8

19 19 9

19 20 10

create table DEP

( DEPID number(10) not null,

DEPNAME varchar2(256),

UPPERDEPID number(10)

)

INSERT INTO DEP(DEPID, DEPNAME, UPPERDEPID) VALUES (0, '总经办', null);

INSERT INTO DEP(DEPID, DEPNAME, UPPERDEPID) VALUES (1, '开发部', 0);

INSERT INTO DEP(DEPID, DEPNAME, UPPERDEPID) VALUES (2, '测试部', 0);

INSERT INTO DEP(DEPID, DEPNAME, UPPERDEPID) VALUES (3, 'Sever开发部', 1);

INSERT INTO DEP(DEPID, DEPNAME, UPPERDEPID) VALUES (4, 'Client开发部', 1);

INSERT INTO DEP(DEPID, DEPNAME, UPPERDEPID) VALUES (5, 'TA测试部', 2);

INSERT INTO DEP(DEPID, DEPNAME, UPPERDEPID) VALUES (6, '项目测试部', 2);

commit;

SELECT RPAD(' ', 2*(LEVEL-1),'-') || DEPNAME "DEPNAME",

CONNECT_BY_ROOT depname "ROOT",

CONNECT_BY_ISLEAF "ISLEAF",

LEVEL,

SYS_CONNECT_BY_PATH(DEPNAME, '/') "PATH"

FROM DEP

START WITH depid=0

CONNECT BY PRIOR DEPID = UPPERDEPID;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: