日期:2014-05-17  浏览次数:20785 次

大家替我看看一条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