Sql 查找缺失的序列号

Sql 查找缺失的序列号,sql,oracle,oracle11g,sequence,Sql,Oracle,Oracle11g,Sequence,我想创建一个表来查找缺少的序列号。序列号在0到70000之间达到70000后变为0。在特定的时间段内,我需要找到那些丢失的记录。此解决方案基于一条语句,该语句生成从1到您设置的某个限制的所有自然数: SELECT ROWNUM N FROM dual CONNECT BY LEVEL <= 7000 .我刚才从Tom Kyte那里偷了这个: select id, one_before, Diff, dense_rank() over (order by Diff desc) rank

我想创建一个表来查找缺少的序列号。序列号在0到70000之间达到70000后变为0。在特定的时间段内,我需要找到那些丢失的记录。

此解决方案基于一条语句,该语句生成从1到您设置的某个限制的所有自然数:

SELECT ROWNUM N FROM dual CONNECT BY LEVEL <= 7000

.

我刚才从Tom Kyte那里偷了这个:

select  id, one_before, Diff, dense_rank() over (order by Diff desc) rank from (
select  id, one_before,
            case when (id - one_before) > 1 then (id - one_before)
           else 1
           end Diff
 from (
       select id, lag(id) over(order by id) one_before
      from table_name order by id) )
原始讨论位于。

您可以使用它来检测序列中的间隙。 该解决方案不会将您限制为特定的上限数字,如70000。 检测:

。 穿越:

select  id, one_before, Diff, dense_rank() over (order by Diff desc) rank from (
select  id, one_before,
            case when (id - one_before) > 1 then (id - one_before)
           else 1
           end Diff
 from (
       select id, lag(id) over(order by id) one_before
      from table_name order by id) )
SELECT *
  FROM (SELECT lag(c.id) over(ORDER BY id) last_id,
               c.id curr_id,
               lead(c.id) over(ORDER BY id) next_id
          FROM mytable c
         order by id)
 WHERE nvl(last_id, curr_id) + 1 <> curr_id
   AND last_id IS NOT NULL
begin
  FOR x IN (SELECT *
              FROM (SELECT lag(c.id) over(ORDER BY id) last_id,
                           c.id curr_id,
                           lead(c.id) over(ORDER BY id) next_id
                      FROM mytable c order by id)
             WHERE nvl(last_id, curr_id) + 1 <> curr_id AND 
             last_id IS NOT NULL
            ) LOOP
    dbms_output.put_line('last_id :' || x.last_id);
    dbms_output.put_line('curr_id :' || x.curr_id);
    dbms_output.put_line('next_id :' || x.next_id);
    dbms_output.put('gaps found: ');
    for j in x.last_id + 1 .. nvl(x.next_id,x.curr_id) - 1   loop
      if  j != x.curr_id then
      dbms_output.put(j || ', ');
      end if;      
    end loop;
    dbms_output.put_line('');
    dbms_output.put_line('*****');
  end loop;
end;