我有一个这样的表记录列表:
20180108001
20180108002
20180108003
20180108004
以此类推
在某个时候,这个序列像这样破裂
20180108099
20180108102
缺少100和101条记录
是否有一个“选择”命令来提取第一个NON顺序记录?
答案 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设置行号,然后获取顺序记录组。
然后使用聚合函数从这些组中获取MIN
和MAX
的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