2015-08-05 2 views
3

У меня есть столбец типа number. Он имеет как положительные, так и отрицательные значения. Мне нужно, чтобы получить 4 значения: положительный максимум, положительный минимум, отрицательный максимум, отрицательный минимум:Как найти отрицательный максимум и положительный минимум в Oracle?

а) Для получения положительного максимума: Я могу использовать Check out the Fiddle

select max(cola) from test; 

б) Для того, чтобы получить отрицательный минимум: я могу использовать Check out the Fiddle

select min(cola) from test; 

у меня есть два вопроса здесь:

1) Теперь я не знаю, как получить другие два значения. Направьте меня, чтобы получить это

2) Между тем, пытаясь это, я получил еще одно сомнение. Когда у меня есть столбец типа varchar2, и он имеет числа как значение. Я выполняю вышеуказанную операцию в этой колонке. Положительный максимум такой же, как и выше. Но отрицательный минимум тихий. Check Fiddle Here. Почему нет правильного неявного преобразования здесь. Кто-нибудь объясняет причину этого?

+0

Для вопроса 1 используйте ** CASE ** выражение. Для вопроса 2 используйте ** TO_NUMBER **, чтобы сначала преобразовать строку в число, а затем - то же самое. –

ответ

3

На вопрос 1, вы можете легко использовать случай, чтобы определить, какие значения вы делаете мин/макс на. Например .:

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, вы собираетесь делать сравнения строк, НЕ число сравнений. Вы должны явно преобразовать значения в числа, так как Oracle не знает, что вы ожидали, что произойдет неявное преобразование. И в любом случае вы не должны полагаться на неявные преобразования. Например .:

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.

нотабене Я явно разделил как отрицательные, так и положительные значения (я положил 0 с положительными числами, вам нужно решить, как вы хотите обрабатывать строки со значением 0!), На всякий случай, если отрицательных чисел не было или нет положительных чисел.

+0

Я должен добавить, что вы можете столкнуться с проблемами, если у вас есть оба номера и текст, хранящиеся в столбце varchar2, и вы делаете to_number() в теме. Но вы никогда не храните данные в столбце с неправильным типом данных, верно ?! * {;-) – Boneist

+0

Да, в этом столбце не будет текста :) – Crazy2crack

+0

Конечно, не будет, если он был определен как НОМЕР! * {;-) – Boneist

1

выражения для использования в рамках функций агрегации.

например.

макс (при коле <-тогда кола конец) max_neg

мин (кола) 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 | 
+0

q 2 (было добавлено?), Как указано в другом месте, используйте TO_NUMBER() –

-1

Чтобы получить положительное минимальное значение попробовать это ..

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

Чтобы получить отрицательное максимальное значение попробовать это ..

select max(cola) from test where cola<0; 
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 в НОМЕР, а затем использовать один и тот же запрос. Для меньшего набора номера to_number каждый раз вы можете использовать С предложением.

ПРИМЕЧАНИЕ Вы должны быть только цифры в этой колонке, и не буквенно-цифровой. Кроме того, обязательно получите 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> 
Смежные вопросы