Наибольшее значение из двух или более полей


84

Мне нужно получить наибольшее значение из двух полей:

SELECT MAX(field1), MAX(field2)

Как я могу получить максимальную отдачу от этих двух?


8
GREATEST()для самых больших аналогично LEAST()для самых маленьких.
Джеймс Оравек

Ответы:


170

Вы можете использовать GREATEST()функцию:

SELECT GREATEST(field1, field2);

Если вы хотите получить абсолютный максимум из всех строк, вы можете использовать следующее:

SELECT GREATEST(MAX(field1), MAX(field2));

Пример 1:

SELECT GREATEST(1, 2);
+----------------+
| GREATEST(1, 2) |
+----------------+
|              2 |
+----------------+
1 row in set (0.00 sec)

Пример 2:

CREATE TABLE a (a int, b int);

INSERT INTO a VALUES (1, 1);
INSERT INTO a VALUES (2, 1);
INSERT INTO a VALUES (3, 1);
INSERT INTO a VALUES (1, 2);
INSERT INTO a VALUES (1, 4);

SELECT GREATEST(MAX(a), MAX(b)) FROM a;
+--------------------------+
| GREATEST(MAX(a), MAX(b)) |
+--------------------------+
|                        4 |
+--------------------------+
1 row in set (0.02 sec)

не знаю почему, но только GREATEST(MAX(field1), MAX(field2))работает. Возвращается другой неправильный номер (не самый большой)
Цяо

1
@Qiao: Да, вам нужно SELECT GREATEST(MAX(field1), MAX(field2));получить абсолютный максимум из всех строк. Если вы используете, SELECT GREATEST(field1, field2);вы получите набор результатов с максимумом между field1 и field2 для каждой строки.
Даниэль Вассалло

Это то, что я искал, я был уверен, что для этого есть функция, но я понятия не имел о названии, теперь оно имеет смысл :)
Эмиль Боркони

40

Если вы выбираете НАИЛУЧШИЙ () для каждой строки

SELECT GREATEST(field1, field2)

Он вернет NULL, если одно из полей NULL. Вы можете использовать IFNULL для решения этой проблемы

SELECT GREATEST(IFNULL(field1, 0), IFNULL(field2, 0))

Да, грустно, что тебе приходится делать все это, IFNULLдаже когда у тебя есть два десятка полей для сравнения!
Ifedi Okonkwo

6
mysql> SELECT GREATEST(2,0);
        -> 2

Поэтому постарайтесь:

mysql> SELECT GREATEST(MAX(field1), MAX(field2));

1
SELECT max( CASE
                WHEN field1 > field2 THEN field1
                ELSE field2
            END ) as biggestvalue 
FROM YourTable;

Это решение невозможно, когда у меня есть сотни столбцов.
Deepak

1
@Deepak, хорошо, но ответ более 10 лет назад, когда я не знал о вызове функции "НАИБОЛЬШИЙ" или "НАИМЕНЬШИЙ", но в исходном сообщении спрашивалось о 2 столбцах, и если у вас есть таблица с сотнями столбцов в в аналогичном контексте, то вам необходимо пересмотреть серьезную проблему проектирования базы данных.
DRapp

Да, верно, спасибо за разъяснения. Теперь ваш комментарий поможет другим понять, что и когда использовать.
Deepak

0

Использование GREATEST / LEAST с MIN / MAX

НАИБОЛЕЕ / НАИМЕНЕЕ : используется со столбцами, когда вы хотите найти максимальное или минимальное значение из различных столбцов.

МИН МАКС : используется со строками, когда вы хотите найти максимальное или минимальное значение из различных строк:

Примерная таблица:

введите описание изображения здесь

SELECT GREATEST(col_a, col_b, col_c) FROM temp;

введите описание изображения здесь

SELECT MIN(GREATEST(col_a, col_b, col_c)) FROM temp; # 3 as output
SELECT MAX(GREATEST(col_a, col_b, col_c)) FROM temp; # 9 as output


SELECT LEAST(col_a, col_b, col_c) FROM temp;

введите описание изображения здесь

SELECT MIN(LEAST(col_a, col_b, col_c)) FROM temp; # 1 as output
SELECT MAX(LEAST(col_a, col_b, col_c)) FROM temp; # 7 as output
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.