如何在Oracle中找到负最大值和最小值?

时间:2015-08-05 11:03:30

标签: sql oracle oracle11g max min

我有一个number类型的列。它既有正面价值,也有负面价值。我需要得到4个值:正最大值,正最小值,负最大值,负最小值:

a)获得正面最大值:我可以使用Check out the Fiddle

select max(cola) from test;

b)获得最低负数:我可以使用Check out the Fiddle

select min(cola) from test;

我在这里有两个问题:

1)现在我不确定如何获得其他两个值。指导我去那个

2)同时尝试这个时我又有了疑问。当我有一些varchar2类型的列并且它有数字作为值。我正在本专栏中执行上述操作。正极限与上述相同。但负最小值是安静的怪异。 Check Fiddle Here。为什么没有适当的隐式转换在这里发生。有人请解释这背后的原因吗?

4 个答案:

答案 0 :(得分:3)

对于问题1,您可以轻松使用案例来确定您执行最小值/最大值的值。 E.g:

select max(case when cola >= 0 then cola end) max_positive,
       min(case when cola >= 0 then cola end) min_positive,
       max(case when cola < 0 then cola end) max_negative,
       min(case when cola < 0 then cola end) min_negative
from   test;

对于问题2,当您对varchar的某些内容执行最小值/最大值时,您将进行字符串比较, NOT 数字比较。您必须将值显式转换为数字,因为Oracle并不知道您希望进行隐式转换。而且你无论如何都不应该依赖隐式转换。 E.g:

select max(case when to_number(cola) >= 0 then to_number(cola) end) max_positive,
       min(case when to_number(cola) >= 0 then to_number(cola) end) min_positive,
       max(case when to_number(cola) < 0 then to_number(cola) end) max_negative,
       min(case when to_number(cola) < 0 then to_number(cola) end) min_negative
from   test1;

Here's the SQLFiddle for both cases.

N.B。我已经明确地将正值和正值分开(我用正数加上0;你必须决定如何处理值为0的行!),以防万一没有负数或没有正数。

答案 1 :(得分:1)

聚合函数中的用例表达式。

e.g。

max(当可乐<0然后可乐结束时)max_neg

min(可乐)min_neg - 这里不需要案例表达

SQL Fiddle

Oracle 11g R2架构设置

Create table test(COLA number);

Insert into test values(1);
Insert into test values(50);
Insert into test values(-65);
Insert into test values(25);
Insert into test values(-2);
Insert into test values(-8);
Insert into test values(5);
Insert into test values(-11);

Create table test1(COLA varchar2(10));

Insert into test1 values('1');
Insert into test1 values('50');
Insert into test1 values('-65');
Insert into test1 values('25');
Insert into test1 values('-2');
Insert into test1 values('-8');
Insert into test1 values('5');
Insert into test1 values('-11');

查询1

select
      max(case when cola < 0 then cola end) max_neg_cola
    , min(cola) 
    , min(case when cola > 0 then cola end) min_pos_cola
    , max(cola) 
from test

<强> Results

| MAX_NEG_COLA | MIN(COLA) | MIN_POS_COLA | MAX(COLA) |
|--------------|-----------|--------------|-----------|
|           -2 |       -65 |            1 |        50 |

答案 2 :(得分:1)

  

1)现在我不确定如何获得其他两个值。

使用 CASE 表达式。

SQL> SELECT MAX(
  2    CASE
  3      WHEN cola >= 0
  4      THEN cola
  5    END) max_positive,
  6    MIN(
  7    CASE
  8      WHEN cola >= 0
  9      THEN cola
 10    END) min_positive,
 11    MAX(
 12    CASE
 13      WHEN cola < 0
 14      THEN cola
 15    END) max_negative,
 16    MIN(
 17    CASE
 18      WHEN cola < 0
 19      THEN cola
 20    END) min_negative
 21  FROM test;

MAX_POSITIVE MIN_POSITIVE MAX_NEGATIVE MIN_NEGATIVE
------------ ------------ ------------ ------------
          50            1           -2          -65

SQL>
  

2)同时尝试这个时我又有了疑问。当我有一些varchar2类型的列,它有数字作为值。我正在本专栏中执行上述操作。正极限与上述相同。但是负最小值很安静。

您需要先将 STRING 转换为 NUMBER ,然后再使用相同的查询。为了减少每次输入to_number的次数,可以使用 WITH 子句。

注意您必须在此列中只包含数字,并且不能包含字母数字。否则,请确保 ORA-01722: invalid number 错误。

SQL> WITH t AS
  2    ( SELECT to_number(cola) cola FROM test1
  3    )
  4  SELECT MAX(
  5    CASE
  6      WHEN cola >= 0
  7      THEN cola
  8    END) max_positive,
  9    MIN(
 10    CASE
 11      WHEN cola >= 0
 12      THEN cola
 13    END) min_positive,
 14    MAX(
 15    CASE
 16      WHEN cola < 0
 17      THEN cola
 18    END) max_negative,
 19    MIN(
 20    CASE
 21      WHEN cola < 0
 22      THEN cola
 23    END) min_negative
 24  FROM t;

MAX_POSITIVE MIN_POSITIVE MAX_NEGATIVE MIN_NEGATIVE
------------ ------------ ------------ ------------
          50            1           -2          -65

SQL>

答案 3 :(得分:-1)

要获得正的最小值,请尝试这个..

select min(cola) from test where cola>0;

要获得负的最大值,请尝试此..

select max(cola) from test where cola<0;