sql - 如果为空,请选择不同的聚合值?

标签 sql aggregate-functions

假设我有以下数据样本:

示例 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.idNULL如果是,则返回 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/

相关文章:

没有结果的sql返回日期

mysql - (MySQL) MPTT/嵌套集模型上的聚合函数

sql - 当 PostgreSQL 中特定字段的平均值为空时如何分配零(0)

arrays - 如何在 PostgreSQL 函数中声明一个行类型数组?

MySQL 查找每个邮政编码中最贵的

mysql - 在带有索引的查询中添加 where 子句会大大降低速度

mysql - 连接 JPA Hibernate MySQL 的预期路径

sql - 查找并删除可以在两列之间交换值的重复条目

c# - 如何在一条语句中向SQL命令添加多个参数?

mysql - SUM 并从 MySQL 中的两个表中获取 AVG,并根据它们的 DATE 使用 WHERE 子句