sql - 在数据库表中查找最大的非现值
问题描述
我有一个数据库表(tbl)。它有一列 - 一个正整数 (id) 的主键。如何找到表中不存在且小于给定值 N 的最大值?
这是我迄今为止最好的镜头:
SELECT MAX(tbl1.id)-1
FROM tbl AS tbl1
WHERE NOT EXISTS (SELECT *
FROM tbl AS tbl2
WHERE tbl2.id = (tbl1.id - 1)
) AND
tbl1.id <= N
但这仅在表中存在 N 或 N-1 时才有效。如果两者都不存在,那么我希望得到 N-1 作为结果。上面的查询要么不返回任何值(如果没有值 < N),或者返回小于 N-1 的值(如果至少有一个值 < N)。
解决方案
要获得低于表中最大值的最大值,可以使用:
select max(id) - 1
from (select t.*, lag(id) over (order by id) as prev_id
from tbl t
) t
where prev_id <> id - 1
考虑N
到会变得棘手,但这应该有效:
select max(case when id < N then id - 1
when prev_id < N - 1 then N - 1
end)
from (select t.*, lag(id) over (order by id) as prev_id
from tbl t
) t
where prev_id <> id - 1;
推荐阅读
- android - 执行调用 db.delete 时如何修复“无法识别的令牌”
- sql - 使用 VBA 将数据从 SQL Server 移动到 Excel 的复杂性
- shell - 需要使用 shell 从访问日志中打印超过 200 个状态码的行
- maps - 您可以使用城市/州而不是 Lat/Lng 来居中 Google 地图吗?
- python - 导入模块,当多个(子)文件夹具有相同名称时
- .net - 为什么在 SelectMany 中引发异常后我的进程仍然存在,而类似 rx 运算符中的异常导致未处理的异常?
- javascript - 如何设置公共 Google Cloud Storage 存储桶的 CORS 以避免使用 javascript 提取功能时出错?
- ios - 定义一个不会被取消引用的委托?
- android - 为 android 项目设置 azure devops 构建管道的问题
- vb.net - (InvalidCastException):指定的强制转换无效