我有一个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。为什么没有适当的隐式转换在这里发生。有人请解释这背后的原因吗?
答案 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 - 这里不需要案例表达
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;