按序列SQL搜索缺失的数字

时间:2018-02-05 15:21:49

标签: sql oracle

我需要帮助来编写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

谢谢

3 个答案:

答案 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;。