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 和数字发行版

Navicat 文章
频道条目
分享
文章归档