您的位置:首页 > 其它

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

2015-03-19 17:02 148 查看
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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: