我需要帮助来编写SQL脚本以解决以下问题:
我们的表T
包含许多列。我只对列感兴趣:
NAME
(苹果,橘子,柠檬......)
SEQUENCE
(0 - >无穷大。有时会发生序列号为-1
但必须忽略负值,因为我们只关注正值。
目标是按选择的NAME
按顺序查找缺失的数字。
e.g。
我想在APPLE
的APPLE_SEQ序列中搜索缺失的数字。有数字0,1,2,-1,3,4,5,8,-1,12。
所以结果应该是这样的:
APPLE_SEQ_missing
6
7
9
10个
11
谢谢
答案 0 :(得分:1)
我认为以下查询可以帮助您按名称找到缺失的序列号组
select l.name,l.seq+1 abc
from mytable2 l
left outer join mytable2 r on l.seq + 1 = r.seq and l.name = r.name
where r.seq is null
order by name,l.seq+1 asc;
答案 1 :(得分:1)
这是一种方法。我认为name
是一个唯一的密钥(否则这个问题没有多大意义)。我还假设您希望每个序列从1开始(因此,如果您发现值2,3,5,则需要将1和4标识为缺失)。
<强>设定:强>
create table
inputs ( name, seq ) as (
select 'Ada', 1 from dual union all
select 'Ada', 2 from dual union all
select 'Ada', 4 from dual union all
select 'Ada', 6 from dual union all
select 'Ben', 3 from dual union all
select 'Ben', 5 from dual
)
;
期望的输出:
NAME SEQ
---- ---
Ada 3
Ada 5
Ben 1
Ben 2
Ben 4
查询以获得所需的输出:
with
max_seq ( name, mseq ) as (
select name, max(seq)
from inputs
group by name
)
select name, level as seq
from max_seq
where (name, level) not in (select name, seq from inputs)
connect by level <= mseq
and prior name = name
and prior sys_guid() is not null
order by name, seq
;
注意 - 在上面写的WITH子句中有列名只在Oracle 11.2及更高版本中有效。对于早期版本,请写with max_seq as (select name, max(seq) as mseq from...
答案 2 :(得分:0)
这有效:
select lvl from (
select level lvl from
(
select min(val) as mini, max(val) as maxi from T where val <> -1 and name='test'
)
where level<maxi and level >mini connect by level<maxi
)
where lvl not in (select val from T where val <> -1 and name='test');
说明:
select level lvl from dual where level<10 and level >3 connect by level<10
返回3 ans 10之间的所有数字,不包括在内。
内部内部查询只检查上限和下限以提供此查询。
最后,我们会查找完整数字列表中存在的所有值,但不会在表T中查找用户名为&#39; test&#39;。