查找某张表中未使用到的连续数值

SELECT * FROM HXL_CL_ZH_20150108


select 1106.99 * 8 / 1024 MB FROM dual;


SELECT 18633.78 * 26796 FROM dual;


--分析数据
WITH T AS (
SELECT 12340000 beg,12349999 end_n FROM dual UNION ALL
SELECT 12340011,12340011 FROM dual UNION ALL 
SELECT 12340012,12340012 FROM dual UNION ALL 
SELECT 12340100,12349999 FROM dual UNION ALL
SELECT 12340016,12340019 FROM dual UNION ALL 
SELECT 12340021,12340025 FROM dual
),
t1 AS (
SELECT t.beg,t.end_n,
LEAD(t.beg,1,t.end_n)OVER(ORDER BY t.beg) beg_2,
MAX(t.end_n)OVER(ORDER BY t.beg) end_2 
FROM t ORDER BY beg
)
SELECT * FROM t1;


--最终结果
WITH T AS (
SELECT 12340000 beg,12349999 end_n FROM dual UNION ALL
SELECT 12340011,12340011 FROM dual UNION ALL 
SELECT 12340012,12340012 FROM dual UNION ALL 
SELECT 12340100,12349999 FROM dual UNION ALL
SELECT 12340016,12340019 FROM dual UNION ALL 
SELECT 12340021,12340025 FROM dual
),
t1 AS (
SELECT t.beg,t.end_n,
LEAD(t.beg,1,t.end_n)OVER(ORDER BY t.beg) beg_2,
MAX(t.end_n)OVER(ORDER BY t.beg) end_2 
FROM t ORDER BY beg
),
t2 AS (
SELECT t1.beg,CASE WHEN t1.end_n > t1.beg_2 THEN t1.beg_2-1 ELSE end_n END end_n FROM t1 UNION 
--SELECT t1.beg_2+1,t1.end_2 FROM t1 WHERE t1.end_n = t1.beg_2 UNION 
SELECT t1.end_n+1,t1.beg_2-1 FROM t1 WHERE t1.end_n+1 <= t1.beg_2-1
)
SELECT * FROM t2 ORDER BY beg;




---
--分析数据
WITH T AS (
select 11330000 beg,11339999 end_n from dual union all
select 12340000 begin_msisdn,12349999 end_msisdn from dual union all
select 12350000 begin_msisdn,12359999 end_msisdn from dual union all
select 12360000 begin_msisdn,12369999 end_msisdn from dual union all
select 14000000 begin_msisdn,14009999 end_msisdn from dual UNION ALL
select 12340011 begin_msisdn,   12340011 end_msisdn from dual union all    
select 12340012 begin_msisdn,   12340012 end_msisdn from dual union all
select 12360101 begin_msisdn,   12360101 end_msisdn from dual union all
select 12360012 begin_msisdn,   12360012 end_msisdn from dual union all    
select 12360013 begin_msisdn,   12360013 end_msisdn from dual union all
select 12390100 begin_msisdn,   12390100 end_msisdn from dual
),
t1 AS (
SELECT t.beg,t.end_n,
LEAD(t.beg,1,t.end_n)OVER(ORDER BY t.beg) beg_2,
MAX(t.end_n)OVER(ORDER BY t.beg) end_2 
FROM t ORDER BY beg
)
SELECT * FROM t1;






WITH t AS (
select 11330000 beg,11339999 end_n from dual union all
select 12340000 begin_msisdn,12349999 end_msisdn from dual union all
select 12350000 begin_msisdn,12359999 end_msisdn from dual union all
select 12360000 begin_msisdn,12369999 end_msisdn from dual union all
select 14000000 begin_msisdn,14009999 end_msisdn from dual UNION ALL
select 12340011 begin_msisdn,   12340011 end_msisdn from dual union all    
select 12340012 begin_msisdn,   12340012 end_msisdn from dual union all
select 12360101 begin_msisdn,   12360101 end_msisdn from dual union all
select 12360012 begin_msisdn,   12360012 end_msisdn from dual union all    
select 12360013 begin_msisdn,   12360013 end_msisdn from dual union all
select 12390100 begin_msisdn,   12390100 end_msisdn from dual
),
t1 AS (
SELECT t.beg,t.end_n,
LEAD(t.beg,1,t.end_n)OVER(ORDER BY t.beg) beg_2,
MAX(t.end_n)OVER(ORDER BY t.beg) end_2 
FROM t ORDER BY beg
),
t2 AS (
SELECT t1.beg,CASE WHEN t1.end_n > t1.beg_2 THEN t1.beg_2-1 ELSE end_n END end_n FROM t1 UNION  
SELECT t1.end_n+1,t1.beg_2-1 FROM t1 WHERE t1.end_n+1 <= t1.beg_2-1
)
SELECT * FROM t2 --WHERE FLOOR(beg/10000) = FLOOR(end_n/10000) 
ORDER BY beg;









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值