17,088
社区成员
发帖
与我相关
我的任务
分享
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 河北 唐山
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 湖南 长沙
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