如何解决如何在Oracle中将数字丢失100
我需要在oracle的一个表列中找到丢失的数字,其中丢失的数字必须取100s,这意味着,如果找到的数字至少在2000到2099之间,则所有在2000到2099之间的丢失数字都必须是返回等等。
这是一个阐明我需要的示例:
griddata
结果必须为2000,2003,2005至2099,2100至2104,2106至2199,3000至3005,3007至3099,9400至9409,9411至9499。
create table test1 ( a number(9,0));
insert into test1 values (2001);
insert into test1 values (2002);
insert into test1 values (2004);
insert into test1 values (2105);
insert into test1 values (3006);
insert into test1 values (9410);
commit;
解决方法
您可以按以下方式使用分层查询:
SQL> SELECT A FROM (
2 SELECT A + COLUMN_VALUE - 1 AS A
3 FROM ( SELECT DISTINCT TRUNC(A,- 2) A
4 FROM TEST_TABLE) T
5 CROSS JOIN TABLE ( CAST(MULTISET(
6 SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 100
7 ) AS SYS.ODCINUMBERLIST) ) LEVELS
8 )
9 MINUS
10 SELECT A FROM TEST_TABLE;
A
----------
2000
2003
2005
2006
2007
2008
2009
.....
.....
,
我喜欢为此使用标准的递归查询。
with nums (a,max_a) as (
select min(a),max(a) from test1
union all
select a + 1,max_a from nums where a < max_a
)
select n.a
from nums n
where not exists (select 1 from test1 t where t.a = n.a)
order by n.a
with
子句采用表中a
的最小值和最大值,并生成介于两者之间的所有数字。然后,外部查询将过滤表中不存在的查询。
如果要生成缺失数字范围而不是完整列表,可以使用窗口函数代替:
select a + 1 start_a,lead_a - 1 end_a
from (
select a,lead(a) over(order by a) lead_a
from test1
) t
where lead_a <> a + 1
编辑:
如果您希望丢失的值在数千个范围内,那么我们可以对递归解决方案进行一些调整:
with nums (a,max_a) as (
select distinct floor(a / 100) * 100 a,floor(a / 100) * 100 + 100 from test1
union all
select a + 1,max_a from nums where a < max_a
)
select n.a
from nums n
where not exists (select 1 from test1 t where t.a = n.a)
order by n.a
,
假设您为范围定义了固定的上下限,那么只需使用NOT EXISTS
之类的来消除当前查询的结果,例如
SQL> exec :min_val:=2000
SQL> exec :min_val:=2499
SQL> SELECT *
FROM
(
SELECT level + :min_val - 1 AS nr
FROM dual
CONNECT BY level <= :max_val - :min_val + 1
)
WHERE NOT EXISTS ( SELECT * FROM test1 WHERE a = nr )
ORDER BY nr;
/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。