首页 > 解决方案 > 在数据库表中查找最大的非现值

问题描述

我有一个数据库表(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)。

标签: sqlpostgresql

解决方案


要获得低于表中最大值的最大值,可以使用:

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;

推荐阅读