- UID
- 29867
- 阅读权限
- 100
- 帖子
- 55691
- 精华贴数
- 21
- 技术排名
- 20
- 技术积分
- 55068
- 社区排名
- 58
- 社区积分
- 31062
- 注册时间
- 2002-11-27
- 精华贴数
- 21
- 技术积分
- 55068
- 社区积分
- 31062
- 注册时间
- 2002-11-27
- 论坛徽章:
- 357
|
发表于 2006-1-17 01:52:34
|显示全部楼层
表结构同上
测试数据更新如下:
Insert into T8
(A, B, C, Q)
Values
(100, 199, 2, 'A');
Insert into T8
(A, B, C, Q)
Values
(0, 999, 1, 'A');
Insert into T8
(A, B, C, Q)
Values
(300, 499, 2, 'A');
Insert into T8
(A, B, C, Q)
Values
(555, 666, 2, 'A');
Insert into T8
(A, B, C, Q)
Values
(200, 299, 2, 'A');
Insert into T8
(A, B, C, Q)
Values
(877, 877, 2, 'A');
Insert into T8
(A, B, C, Q)
Values
(1499, 4888, 1, 'A');
Insert into T8
(A, B, C, Q)
Values
(1600, 2398, 2, 'A');
Insert into T8
(A, B, C, Q)
Values
(3000, 3999, 2, 'A');
Insert into T8
(A, B, C, Q)
Values
(5000, 6999, 1, 'A');
Insert into T8
(A, B, C, Q)
Values
(4887, 4887, 2, 'A');
COMMIT;
select S,E from
(
SELECT NVL2(LAG(A)OVER(PARTITION BY Q, xx ORDER BY A),B+1,MIN(A)OVER(PARTITION BY Q, xx)) S,
NVL(LEAD(A)OVER(PARTITION BY Q, xx ORDER BY A)-1,MAX(B)OVER(PARTITION BY Q, xx)) E from
(
select t8.*, nvl(prior a,a) xx from t8 START WITH C=1 CONNECT BY C-1 = PRIOR C AND Q= PRIOR Q
and A>= prior a and b<= prior b
)
)
where s<=e
[php]
SQL> select * from t8;
A B C Q
---------- ---------- ---------- -
100 199 2 A
0 999 1 A
300 499 2 A
555 666 2 A
200 299 2 A
877 877 2 A
1499 4888 1 A
1600 2398 2 A
3000 3999 2 A
5000 6999 1 A
4887 4887 2 A
已选择11行。
已用时间: 00: 00: 00.02
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF 'T8'
SQL> select S,E from
2 (
3 SELECT NVL2(LAG(A)OVER(PARTITION BY Q, xx ORDER BY A),B+1,MIN(A)OVER(PARTIT
ION BY Q, xx)) S,
4 NVL(LEAD(A)OVER(PARTITION BY Q, xx ORDER BY A)-1,MAX(B)OVER(PARTITION BY Q,
xx)) E from
5 (
6 select t8.*, nvl(prior a,a) xx from t8 START WITH C=1 CONNECT BY C-1 = PRI
OR C AND Q= PRIOR Q
7 and A>= prior a and b<= prior b
8 )
9 )
10 where s<=e
11 /
S E
---------- ----------
0 99
500 554
667 876
878 999
1499 1599
2399 2999
4000 4886
4888 4888
5000 6999
已选择9行。
已用时间: 00: 00: 00.01
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 VIEW
2 1 WINDOW (SORT)
3 2 VIEW
4 3 CONNECT BY (WITH FILTERING)
5 4 NESTED LOOPS
6 5 TABLE ACCESS (FULL) OF 'T8'
7 5 TABLE ACCESS (BY USER ROWID) OF 'T8'
8 4 NESTED LOOPS
9 8 BUFFER (SORT)
10 9 CONNECT BY PUMP
11 8 TABLE ACCESS (FULL) OF 'T8'
SQL>
...................................
[/php] |
|