超难sql升级版本!!!

ailiban123 2008-02-01 04:47:32
一张表A结构如下:
number addr city
2100001 北京 北京
2100002 北京 北京
2100003 河北 石家庄
2100004 河北 石家庄
2100005 河北 石家庄
2100017 河北 唐山
2100018 湖南 长沙
2100019 河北 唐山
2100020 河北 唐山
2100021 河北 唐山
. . .
. . .
. . .
. . .
现在要把A表的数据插到B表如下:
begin end provi city
2100001 2100002 北京 北京
2100003 2100005 河北 石家庄
2100017 2100017 河北 唐山
2100018 2100018 湖南 长沙
2100019 2100021 河北 唐山
. . . .
. . . .

我的积分不多,没有多少给大虾。。就当高手练练手呀!!!









...全文
86 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sulins 2008-02-02
  • 打赏
  • 举报
回复
select num,addr,city,rownum rn from table1

--存在顺序问题,需要ORDER BY number
临摹 2008-02-02
  • 打赏
  • 举报
回复
如果要求顺序也要和LZ一样的话就在结尾加上 order by max(rn);

select min(num) begin,max(num) end,addr,city from(
select num,addr,city,rn, rn-rank() over (partition by addr,city order by rn) rn1
from ( select num,addr,city,rownum rn from table1)
)group by addr,city,rn1 order by max(rn);
BEGIN END ADDR CITY
---------- ---------- ---------- ----------
2100001 2100002 北京 北京
2100003 2100005 河北 石家庄
2100017 2100017 河北 唐山
2100018 2100018 湖南 长沙
2100019 2100021 河北 唐山

临摹 2008-02-02
  • 打赏
  • 举报
回复

SQL> select * from table1;

NUM ADDR CITY
---------- ---------- ----------
2100001 北京 北京
2100002 北京 北京
2100003 河北 石家庄
2100004 河北 石家庄
2100005 河北 石家庄
2100017 河北 唐山
2100018 湖南 长沙
2100019 河北 唐山
2100020 河北 唐山
2100021 河北 唐山

已选择10行。

select min(num) begin,max(num) end,addr,city from(
select num,addr,city,rn, rn-rank() over (partition by addr,city order by rn) rn1
from ( select num,addr,city,rownum rn from table1)
)group by addr,city,rn1;

BEGIN END ADDR CITY
---------- ---------- ---------- ----------
2100001 2100002 北京 北京
2100017 2100017 河北 唐山
2100019 2100021 河北 唐山
2100003 2100005 河北 石家庄
2100018 2100018 湖南 长沙
ailiban123 2008-02-02
  • 打赏
  • 举报
回复
咦?。。。sulins你叫晓林?
ailiban123 2008-02-02
  • 打赏
  • 举报
回复
谢谢各位热心大虾噢!!!
我测试。。。测试。。
sulins 2008-02-02
  • 打赏
  • 举报
回复
“结贴”时给分。
你反映说在存储过程中不能执行,因为你没有贴出代码,我只能猜测了。
存储过程不能执行select查询语句(“select 字段 into 变量 from 表名” 是可以的),你改成insert into b select ……。
ailiban123 2008-02-02
  • 打赏
  • 举报
回复
79bo(山芋)的执行完后比sulins(晓林)的代码执行结果多了244行数据。
ailiban123 2008-02-02
  • 打赏
  • 举报
回复
sulins的代码在PL/SQL Developer 的sql窗口测试很好用呀。。 谢啦!!!
只是放到过程里面的话,在编译时通过了,可在测试时却不执行。。。不知为什么。。
注:我新来的,怎么才能给回到问题者加分???? 急!!!!
Croatia 2008-02-01
  • 打赏
  • 举报
回复
wffffc,他要的不是单纯的累积,只有用lag或者lead函数,才可以做到它的要求。
sulins 2008-02-01
  • 打赏
  • 举报
回复
1楼脚本得出的结果是:
begin end provi city
2100001 2100002 北京 北京
2100003 2100005 河北 石家庄
2100017 2100021 河北 唐山
2100018 2100018 湖南 长沙


以下代码可以实现楼主需求:

SELECT MIN(number) begin, MAX(number) end, addr provi, city
FROM
(
select
number,
addr,
city,
SUM(IsFirst) OVER (ORDER BY number) RANK_INDEX --累加,得出分组
from
( --按照number的顺序,判断本行与上一行是否相同,从而得出首行标识
SELECT
number,
addr,
city,
DECODE(addr||'-'||city, LAG(addr||'-'||city, 1, 0) OVER (ORDER BY number), 0, 1) IsFirst
FROM a
)
)
GROUP BY RANK_INDEX, addr, city

wffffc 2008-02-01
  • 打赏
  • 举报
回复
insert into b (select min(number),max(number),addr,city from a group by addr,city)

17,088

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧