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和數位發行

分享
部落格封存檔