读书人

大家替小弟我看看一条SQL能解决不?感

发布时间: 2012-03-07 09:13:51 作者: rapoo

大家替我看看一条SQL能解决不?感觉有点麻烦
表TAB1(PK:COL1)

COL1 COL2
------------
1 A
2 A
3 B
4 B
6 B
5 B
9 B
10 C
11 C

转化为:
表TAB2(PK:COLA)
COLA COLB COLC
--------------------
1 2 A
3 6 B
9 9 B
10 11 C

说明:TAB1中COL1是一个顺序值,但可能不连续,也可能顺序乱了,要求转换到TAB2,其中COLA的意思是顺序开始值,COLB的意思是顺序结束值,转化的规则要求将TAB1一条条的记录分段放入TAB2,即TAB1中COL1先排升序后,若COL1中断不连续或者COL2值发生变化时在转入TAB2时另起一行。如果是用后台过程我知道转换,现在想请教用SQL通过分组行不行?另外表TAB1里数据有400万来条,用后台过程处理速度快还是用SQL?

[解决办法]
SQL> desc test
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
NAME VARCHAR2(10)

SQL> select * from test
2 ;

ID NAME
---------- ----------
1 A
2 A
3 B
4 B
6 B
5 B
9 B
10 C
11 C
12 B
13 B

ID NAME
---------- ----------
14 B

12 rows selected.

SQL> select min(id),max(id),name
2 from (select name,id,id-rownum newid
3 from (select id,name from test order by name,id))
4 group by name,newid
5 /

MIN(ID) MAX(ID) NAME
---------- ---------- ----------
1 2 A
12 14 B
3 6 B
9 9 B
10 11 C

[解决办法]
或者
select min(id),max(id),name
from (select id,
name,
id-row_number() over (partition by name order by name,id) newid
from test)
group by name,newid
/

MIN(ID) MAX(ID) NAME
---------- ---------- ----------
1 2 A
10 11 C
9 9 B
12 14 B
3 6 B

读书人网 >oracle

热点推荐