【问题标题】:Oracle SQL Min in Select Clause选择子句中的 Oracle SQL Min
【发布时间】:2018-07-23 06:22:24
【问题描述】:

有人可以帮我写一个 sql 查询,该查询应该根据以下条件执行 oracle min 函数。

例如对于列值

  • 0,0,0,0 那么输出应该是 0
  • 0,null,0,null 那么输出应该是o
  • 0,2,4,5,6 那么输出应该是2(注意我们这里不包括零)
  • 0,2,null,4,5 那么输出应该是 2 (同样我们不包括零)
  • null,null,null,null 那么输出应该为null。

我已经编写了满足上述所有情况的查询,但是当所有列值为空时,最后一种情况失败。它不是返回 null,而是返回 0。有人可以修改下面的查询以适应最后一种情况吗?

从表名中选择 NVL(MIN(NULLIF(columnname,0)),0);

请记住,查询应该可以在 oracle 和 hsqldb 中运行,因为我们使用 hsql db 来运行 junit。

【问题讨论】:

    标签: sql oracle hsqldb min


    【解决方案1】:

    如果您的查询满足所有 4 个案例,那么只需一个案例即可解决您的问题。

    SELECT CASE WHEN MIN(COLUMNNAME) IS NULL THEN NULL ELSE NVL(MIN(NULLIF(COLUMNNAME,0)),0) END FROM TABLENAME;
    

    注意:- 假设您的查询满足所有情况,除了第 5 个。

    【讨论】:

    • 感谢 D.J.这对我帮助很大!为什么我不能想到 CASE..:-)
    【解决方案2】:

    我将在下面显示一个包含两列的输入表,IDVAL,以说明各种可能性。您希望每个ID(甚至整个表)都有一个结果,所以这必须是GROUP BY 和一些聚合函数的工作。您要区分三种类型的值:大于零、零和空(按此顺序);您想要为每个 ID 选择存在的“最高优先级组”(按此优先级顺序),并且仅对于该优先级组,您想要选择最小值。这正是聚合 FIRST/LAST 函数的作用。要按值的三个“类”排序,我们在聚合 LAST 函数的 ORDER BY 子句中使用 CASE 表达式。

    下面的WITH 子句不是解决方案的一部分——我只包含它来创建测试数据(在您的实际情况中,使用您的实际表和列名并删除整个WITH 子句)。

    with
      inputs ( id, val ) as (
        select 1, 0    from dual union all
        select 1, 0    from dual union all
        select 1, 0    from dual union all
        select 2, 0    from dual union all
        select 2, null from dual union all
        select 2, 0    from dual union all
        select 3, 0    from dual union all
        select 3, 2    from dual union all
        select 3, 5    from dual union all
        select 4, 0    from dual union all
        select 4, 3    from dual union all
        select 4, null from dual union all
        select 5, null from dual union all
        select 5, null from dual
      )
    select   id,
             min(val) keep (dense_rank last order by case when val > 0 then 2
                                                          when val = 0 then 1
                                                          else              0 
                                                     end
                           ) as min_val
    from     inputs
    group by id
    order by id
    ;    
    
            ID    MIN_VAL
    ---------- ----------
             1          0
             2          0
             3          2
             4          3
             5           
    

    【讨论】:

    • 感谢 mathguy 的回答,但不幸的是我不能在我当前的代码中进行分组或排序,而且我不确定 hsqldb 是否支持像 oracle 这样的密集排名函数,或者可能是.. 。 我不知道。无论是哪种情况,都非常感谢您回答我的帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 2023-02-07
    • 2018-04-03
    • 2015-07-25
    • 1970-01-01
    • 2018-09-01
    相关资源
    最近更新 更多