查找表记录中缺少的空白

时间:2018-09-10 10:05:14

标签: sql oracle oracle-sqldeveloper

我有一个这样的表记录列表:

20180108001
20180108002
20180108003
20180108004 

以此类推

在某个时候,这个序列像这样破裂

20180108099
20180108102

缺少100和101条记录

是否有一个“选择”命令来提取第一个NON顺序记录?

6 个答案:

答案 0 :(得分:4)

要返回20180108100,请选择上一行并添加1。

select min(col + 1)
from tablename
where col + 1 not in (select col from tablename)

答案 1 :(得分:2)

这是列出特定日期的所有“漏洞”的另一种方法:

SELECT x AS gap_from, next_x AS gap_to
  FROM ( SELECT x, LEAD(x) OVER (ORDER BY x) next_x
            FROM ( SELECT SUBSTR(the_column,-4,3) AS x 
                         FROM the_table 
                         WHERE the_column LIKE '201808%'
                        )
  )
  WHERE x <> next_x-1

它将返回:

gap_from | gap_to
-----------------
099      | 102
etc...

答案 2 :(得分:1)

使用RewriteEngine on RewriteCond %{QUERY_STRING} attachment_id=[0-9]+ RewriteRule ^/$ http://www.example.com/ [L,R=301]函数,如下所示:

lag()

答案 3 :(得分:1)

您可以使用row_number()

select t.* 
from (select t.*, id - (row_number() over (order by id)) as seq
      from table t
     ) t
where seq > 0;

答案 4 :(得分:0)

您可以使用子查询和自我联接

select min(t.id) from t
where t.id  in (

   select t1.id from t t1
          left  join t t2 on t1.id=t2.id+1
          where t2.id is null
               )

答案 5 :(得分:0)

这是一个空白和离岛的问题。通过id设置行号,然后获取顺序记录组。

然后使用聚合函数从这些组中获取MINMAX的ID。

  • MIN(ID) -1非连续记录结束
  • MAX(ID) + 1非连续记录开始。

最终使用LEAD来获取下一个非连续记录的起始值。

您可以尝试一下。

with cte as (
    SELECT MIN(ID) -1  startnum,MAX(ID) +1 endnum
    FROM (
       SELECT  id,id - ROW_NUMBER() OVER(ORDER BY id) grp
       FROM T
    ) t1
    group by grp
)

SELECT endnum from_gap,to_gap 
FROM (
    select *,lead(startnum) over(order by startnum) to_gap
    from cte
) t1
where t1.to_gap is not null