Navicat 博客

获取跨列的最大值 2021 年 6 月 30 日,由 Robert Gravelle 撰写

MAX() 函数通常用于返回给定列的最大值。它对类型并不挑剔,因此该列可能包含薪水、最佳食用日期或姓氏。问题是,MAX() 函数是否也能找到跨多列的最大值?简短的回答是肯定的。更长的解释是它取决于你使用的数据库。在今天的文章中,我们将探索一些获取两列或更多列中最大值的方法,可以使用 MAX() 函数,或者使用更好的替代方法。

MySQL 解决方案

如果你正在使用 MySQL,你可以将 MAX() 与 GREATEST() 函数结合使用,以从两个或多个字段中获取最大值。这是 GREATEST 的语法:

GREATEST(value1,value2,...)

给定两个或更多参数,它返回最大(最大值)的参数。如果任何参数为 NULL,则 GREATEST 返回 NULL。

示例

如果你要跨字段寻找最大值,比较包含相似数据的列会有所帮助,可以说是公平比较。classicmodels 数据库的 products 表包含两个相似的列:“buyPrice”和“MSRP”。两者都将美元数字存储为十进制数据:

products_table (114K)

理想情况下,GREATEST() 输入参数应该是标量值。碰巧的是,MAX() 函数返回列中的最大值!这是Navicat for SQL Server 中的查询和结果:

greatest_function (37K)

毫不奇怪,MSRP 包含最高值。否则,公司可能要考虑不同的供应商。

其他一些解决方案

对于其他不支持 GREATEST() 函数的数据库,有一些方法可以使用 MAX() 来比较多个列。只需要花一点功夫!以下是一些使用 SQL Server 的解决方案:

UNION ALL

UNION ALL 命令组合两个或多个 SELECT 语句的结果集。与 UNION 命令不同,UNION ALL 包括重复项。在任何情况下,都可以利用任一命令将不同的列组合成一个长结果集。然后可以将其结果视为从中派生最大值的子查询:

SELECT MAX(T.field) AS MaxOfColumns
FROM (
    SELECT column1 AS field
    FROM YourTable 
    UNION ALL
    SELECT column2 AS field
    FROM YourTable
    UNION ALL
    SELECT column3 As field
    FROM YourTable) AS T

以下是针对 Navicat for SQL Server中的 Sakila 示例数据库的示例查询,其中包括 rentals 表中的租用日期和归还日期:

union_all (43K)

Select MAX from VALUES

SQL VALUES 关键字不仅仅用于 INSERT。你还可以使用以下语法从值列表中 SELECT:

select (values (1), (2), (3)) as temp(c)

该声明可以扩展以达到我们的目的,如下所示:

SELECT (
  SELECT MAX(myval) 
  FROM (VALUES (column1),(column2),(column3)) AS temp(myval)
) AS MaxOfColumns
FROM
YourTable

我们可以使用此模板作为我们对 rentals 表进行查询的基础:

values (47K)

总结

正如我们今天在这里看到的,有几种方法可以跨多列获取最大值。这些包括使用 GREATEST() 函数,或花一点功夫使用 MAX() 函数。

如果你对 Navicat for SQL Server 感兴趣,可以免费试用 14 天!



Rob Gravelle 居住在加拿大渥太华,是一名有 20 多年经验的 IT 专家。过往,Rob 曾为与情报有关的组织(如加拿大边境服务局和各种商业组织)构建系统。在业余时间,Rob 是一名出色的吉他演奏家,他拥有多张 CD 和数字发行版

分享
文章归档