假设我有以下数据样本:
示例 1:
id|name
-------
0 |0
0 |1
0 |2
0 |3
-------
示例 2:
id|name
-------
0 |0
1 |1
3 |3
4 |4
-------
示例 3:
id|name
-------
0 |0
1 |1
2 |2
3 |3
-------
如果可能的话,我想要的是能够返回序列中最小的缺失值。如果没有,我想返回 MAX(id)+1
作为可用值。
为了获得最小的缺失值,我执行以下操作:
SELECT temptable.id+1 FROM (
SELECT id, LEAD(id, 1) OVER (ORDER BY id) AS lead FROM mytable) AS temptable
WHERE (lead - id) > 1;
这将返回 NULL
对于 sample 1,2 对于 sample 2,以及 NULL
对于示例 3。
现在可以先检查是否 temptable.id
是 NULL
如果是,则返回 MAX(mytable.id)
在单个查询中?
最佳答案
是的。在子查询中计算最大值,然后使用coalesce()
:
SELECT coalesce(id+1, maxid + 1)
FROM (SELECT id, LEAD(id, 1) OVER (ORDER BY id) AS lead,
MAX(id) OVER () as maxid
FROM mytable
) t
WHERE (lead - id) > 1;
顺便说一句,您可以使用 not isn't
来做到这一点:
select min(id) + 1
from mytable t1
where not exists (select 1 from mytable t2 where t2.id = t1.id + 1);
我认为这会同时进行两项计算。如果 id
全部按顺序排列,则只有最大的 id
通过 where
条件。
关于sql - 如果为空,请选择不同的聚合值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25110168/