表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?
------------
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?
COL1 COL2
------------
1 A
2 A
3 B
4 B
6 B
5 B
9 B
10 C
11 C
12 B
13 B
14 B
转化为:
表TAB2(PK:COLA)
COLA COLB COLC
--------------------
1 2 A
3 6 B
9 9 B
10 11 C
12 14 B
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 B12 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
---------- ----------
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
14 B13 rows selected.
select min(id),max(id),name
from (select id,
name,
id-row_number() over (partition by name order by name,id) newid,
row_number() over (partition by name,id order by id) rn
from test)
where rn=1
group by name,newid
/ MIN(ID) MAX(ID) NAME
---------- ---------- ----------
1 2 A
10 11 C
9 9 B
12 14 B
3 6 B
NAME和ID是一个复合索引,且分析过了
就算是几百万,也是比较快的
当然如果是分页查询,可能不尽人意了很多因素影响着性能,机器硬件页很有关系