号段选取应用之已知号码求号段(读书笔记之一)

本文介绍如何运用SQL中的Lead和Lag函数检测数据库表中按年份分组的序列号是否连续,并给出具体实现步骤及示例。
lead和lag的简单应用:
SELECT rown,LAG(rown,2,-1) OVER(ORDER BY rown) PREVIOUS,
       LEAD(rown,2,-1) OVER(ORDER BY rown) NEXT
FROM (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) chazhi
FROM t_hd a;


很显然,差值为0表示连续的,否则表示不连续,那么将这个差值作为过滤条件
SELECT YEAR,bb,haoma,minhm,maxhm
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) chazhi
FROM 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) chazhi
FROM t_hd a)
WHERE chazhi<>0;


这样既可得到结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值