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 文章
頻道記錄
分享
部落格封存檔