来自两个或多个领域的最大价值


83

我需要从两个领域中获得最大的价值:

SELECT MAX(field1), MAX(field2)

现在,我如何从这两个中获得最大的价值?


7
GREATEST()对于最大的LEAST(),对于最小的。
James Oravec 2014年

Answers:


167

您可能要使用以下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
@乔:是的,您需要SELECT GREATEST(MAX(field1), MAX(field2));从所有行中获取绝对最大值。如果使用SELECT GREATEST(field1, field2);,将返回一个结果集,其中每一行的最大值在field1和field2之间。
丹尼尔·瓦萨洛

那就是我一直在寻找的东西,我确定有这个功能,但是我对这个名字
一无所知

39

如果您要为每一行选择GREATEST()

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;

当我有100列时,此解决方案不可行。
迪帕克

1
@Deepak,好的,但是一个十多年前的答案,当时我不知道“ GREATEST”或“ LEAST”函数的调用,但是原始帖子询问了大约两列,如果您有一个包含100列的表格如果它具有类似的上下文,则您有一个严重的数据库设计问题需要重新考虑。
DRapp

是的,谢谢您的澄清。现在,您的评论将帮助其他人何时使用。
迪帕克

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.