号段(连续范围问题) _MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 1933 | 回复: 0   主题: 号段(连续范围问题)         下一篇 
shary
注册用户
等级:新兵
经验:54
发帖:66
精华:0
注册:2011-8-31
状态:离线
发送短消息息给shary 加好友    发送短消息息给shary 发消息
发表于: IP:您无权察看 2015-8-24 9:24:31 | [全部帖] [楼主帖] 楼主

 Oracle:

createtable t (a number primarykey);

insertinto t (a) values (1);

insertinto t (a) values (2);

insertinto t (a) values (3);

insertinto t (a) values (100);

insertinto t (a) values (101);

insertinto t (a) values (103);

insertinto t (a) values (104);

insertinto t (a) values (105);

commit;

-- 连续范围

/*SQL 1*/

selectmin(a) start_range, max(a) end_range

from t

groupby a-rownum

orderby start_range;

/*SQL 2*/

selectmin(b.a) start_range, max(b.a) end_range

from (select a.*, a.a - rownum cc

from (select * from t orderby a) a) b

groupby b.cc

orderby start_range;

/*SQL 3*/

select nvl(lag(e) over (orderby s), minn) start_range, nvl(s,maxn) end_range

from (select lag(a,1) over (orderby a) s,a e,min(a) over() minn, max(a) over () maxn

from t)

where nvl(e - s - 1, 1) <> 0;

-- 间断范围

select s + 1 start_range, e - 1 end_range

from (select nvl(lag(a,1) over (orderby a), 0) s, a e, min(a) over () minn, max(a) over() maxn

from t)

where nvl(e - s - 1, 1) <> 0;

MySQL:

createtable t (a intprimarykey);

insertinto t values (1),(2),(3),(100),(101),(103),(104),(105);

commit;

-- 连续范围

selectmin(a) start_range, max(a) end_range

from (select a, a-rn as diff

from (select a ,@a:=@a+1 rn

from t, (select @a:=0) as a ) as b ) as c

groupby diff;

-- 间断范围

select b.v+1 start_range, b.a-1 end_range

from (select @a as v, t.a, (@a:=t.a)

from t,(select @a:=0) as z) as b

where b.a != b.v+1;

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论