号段选取应用之已知号码求号段(读书笔记之一)
来源:互联网 发布:商城美工招聘 编辑:程序博客网 时间:2024/06/05 16:44
lead和lag的简单应用:
通过指定第二个参数来获得前两行和后两行的内容,第三个参数表示超出范围后的默认值
建表语句:
思路:首先要得到根据year分组,然后分别比较,如果相差为1表示是连续的,另外将最大值和最小值列出来,语句如下
很显然,差值为0表示连续的,否则表示不连续,那么将这个差值作为过滤条件
这里套一层查询的原因是where条件后面不允许使用窗口函数
接下来再结合lag函数得到连续号段
这样既可得到结果
SELECT rown,LAG(rown,2,-1) OVER(ORDER BY rown) PREVIOUS, LEAD(rown,2,-1) OVER(ORDER BY rown) NEXTFROM (SELECT ROWNUM+4 rown FROM dual CONNECT BY ROWNUM<5);
通过指定第二个参数来获得前两行和后两行的内容,第三个参数表示超出范围后的默认值
如果第二个参数超出范围并且未设定默认值,则默认为null
建表语句:
CREATE TABLE t_hd(YEAR NUMBER(5), haoma NUMBER(10));INSERT INTO t_hd VALUES(2014,00000001);INSERT INTO t_hd VALUES(2014,00000002);INSERT INTO t_hd VALUES(2014,00000003);INSERT INTO t_hd VALUES(2014,00000004);INSERT INTO t_hd VALUES(2014,00000005);INSERT INTO t_hd VALUES(2014,00000007);INSERT INTO t_hd VALUES(2014,00000008);INSERT INTO t_hd VALUES(2014,00000009);INSERT INTO t_hd VALUES(2013,00000120);INSERT INTO t_hd VALUES(2013,00000121);INSERT INTO t_hd VALUES(2013,00000122);INSERT INTO t_hd VALUES(2013,00000124);INSERT INTO t_hd VALUES(2013,00000125);COMMIT;
思路:首先要得到根据year分组,然后分别比较,如果相差为1表示是连续的,另外将最大值和最小值列出来,语句如下
SELECT a.year,LAG(a.haoma,1) OVER(PARTITION BY a.year ORDER BY a.haoma) bb, a.haoma, MIN(a.haoma) OVER(PARTITION BY a.year) minhm, MAX(a.haoma) OVER(PARTITION BY a.year) maxhm, nvl(a.haoma-LAG(a.haoma,1) OVER(PARTITION BY a.year ORDER BY a.haoma)-1,1) chazhiFROM t_hd a;
很显然,差值为0表示连续的,否则表示不连续,那么将这个差值作为过滤条件
SELECT YEAR,bb,haoma,minhm,maxhmFROM (SELECT a.year,LAG(a.haoma,1) OVER(PARTITION BY a.year ORDER BY a.haoma) bb, a.haoma, MIN(a.haoma) OVER(PARTITION BY a.year) minhm, MAX(a.haoma) OVER(PARTITION BY a.year) maxhm, nvl(a.haoma-LAG(a.haoma,1) OVER(PARTITION BY a.year ORDER BY a.haoma)-1,1) chazhiFROM t_hd a)WHERE chazhi<>0;
这里套一层查询的原因是where条件后面不允许使用窗口函数
接下来再结合lag函数得到连续号段
SELECT YEAR,haoma,nvl(LEAD(bb,1) OVER(PARTITION BY YEAR ORDER BY haoma),MAXhm) st FROM (SELECT a.year,LAG(a.haoma,1) OVER(PARTITION BY a.year ORDER BY a.haoma) bb, a.haoma, MIN(a.haoma) OVER(PARTITION BY a.year) minhm, MAX(a.haoma) OVER(PARTITION BY a.year) maxhm, nvl(a.haoma-LAG(a.haoma,1) OVER(PARTITION BY a.year ORDER BY a.haoma)-1,1) chazhiFROM t_hd a)WHERE chazhi<>0;
这样既可得到结果
0 0
- 号段选取应用之已知号码求号段(读书笔记之一)
- Oracle层次查询和分析函数在号段选取中的应用
- Oracle层次查询和分析函数在号段选取中的应用
- 层次查询和分析函数(LAG、LEAD)在号段选取中的应用
- Android通讯录开发之获取运营商号码段(移动、联通、电信)
- Android通讯录开发之获取运营商号码段(移动、联通、电信)
- IOS通讯录选取某个号码
- 移动134号段MSISDN号码和IMSI的对应关系(收藏)
- 架构之美-读书笔记之一
- 电信号码段分配
- 移动电话号码段
- JS验证手机号正则表达式(支持多号码段)
- 求尚未使用的号段(读书笔记四)
- SQL查询连续号码段
- SQL查询连续号码段
- Java核心技术--读书笔记(之一)
- Spring+MyBatis 企业应用实战读书笔记之一Java EE应用
- 《程序员修炼之道》读书笔记之一
- 计算机网络笔试题
- 二叉排序树删除指定结点
- UVA 106 Fermat vs. Pythagoras
- (《剑指Offer》笔记)调整数组顺序使奇数位于偶数前面
- pty/tty设备竞争条件漏洞 (CVE-2014-0196)
- 号段选取应用之已知号码求号段(读书笔记之一)
- 怎么在MyEclipse中修改项目名称(部署)
- Cocos2d-x初入学堂 --> CCMenuItem菜单项
- IO中同步、异步与阻塞、非阻塞的区别
- 常见算法笔试或面试题
- hash表
- Weka算法Classifier-tree-RandomForest源码分析(二)代码实现
- ASP.NET 获得客户端IP地址
- C/C++改变终端输出字体的颜色(Linux)