SQL Server中求最大值的方法


📌 两种场景的区别

场景描述使用函数
行内最大值同一行的多列之间比较GREATEST()
跨行最大值多行之间比较(聚合)MAX()
多行多列最大值整个表或多个列的多行数据中找最大值组合使用

🔍 多行多列求最大值的几种方案

方案一:整个表中多列所有行的最大值

如果你想找出整个表中 Col1、Col2、Col3 所有数据的最大值

SELECT MAX(AllValues) AS GlobalMax
FROM (
    SELECT Col1 AS AllValues FROM YourTable
    UNION ALL
    SELECT Col2 FROM YourTable
    UNION ALL
    SELECT Col3 FROM YourTable
) AS Tmp;

或者使用 VALUES(更简洁):

SELECT MAX(Val) AS GlobalMax
FROM YourTable
CROSS APPLY (VALUES (Col1), (Col2), (Col3)) AS Tmp(Val);

方案二:按分组求多行多列的最大值

如果你需要按某个字段分组,每组内求多列的最大值:

SELECT 
    GroupCol,
    MAX(Val) AS GroupMax
FROM YourTable
CROSS APPLY (VALUES (Col1), (Col2), (Col3)) AS Tmp(Val)
GROUP BY GroupCol;

方案三:先求行内最大值,再求跨行最大值

分两步:先用 GREATEST 求每行的最大值,再用 MAX 求所有行的最大值。

-- SQL Server 2022+
SELECT MAX(GREATEST(Col1, Col2, Col3)) AS GlobalMax
FROM YourTable;
-- SQL Server 2019 及更早版本
SELECT MAX(RowMax) AS GlobalMax
FROM (
    SELECT 
        (SELECT MAX(Val) FROM (VALUES (Col1), (Col2), (Col3)) AS Tmp(Val)) AS RowMax
    FROM YourTable
) AS SubQuery;

📊 完整示例对比

假设表数据如下:

IDCol1Col2Col3
1102515
230520
381250
-- 1. 每行的最大值(行内)
SELECT ID, GREATEST(Col1, Col2, Col3) AS RowMax FROM YourTable;
-- 结果:1→25, 2→30, 3→50

-- 2. 整个表所有列的最大值(跨行+跨列)
SELECT MAX(Val) AS GlobalMax
FROM YourTable
CROSS APPLY (VALUES (Col1), (Col2), (Col3)) AS Tmp(Val);
-- 结果:50

-- 3. 先求行内最大,再求跨行最大
SELECT MAX(GREATEST(Col1, Col2, Col3)) AS GlobalMax FROM YourTable;
-- 结果:50

✅ 总结

需求推荐方法
同行多列最大值GREATEST(Col1, Col2, Col3)
单列跨行最大值MAX(Col1)
多行多列全局最大值CROSS APPLY + VALUES + MAXMAX(GREATEST(...))
分组后多行多列最大值CROSS APPLY + VALUES + GROUP BY

核心区别

  • GREATEST = 横向比较(同一行,多列)
  • MAX = 纵向比较(同一列,多行)
  • 多行多列 = 先横向再纵向,或先转成单列再纵向聚合

PS:最小值也是同理的

📌 CASE 表达式是同行比较(行内比较)

CASE 表达式方法:

SELECT 
    列1, 
    列2, 
    列3,
    CASE 
        WHEN 列1 >= 列2 AND 列1 >= 列3 THEN 列1
        WHEN 列2 >= 列3 THEN 列2
        ELSE 列3
    END AS 行最大值
FROM 数据表;

这是同行比较

特征说明
比较范围同一行内的 列1、列2、列3
返回结果每行返回一个最大值
是否聚合❌ 没有使用聚合函数
是否有 GROUP BY❌ 没有分组

结果示例

假设表数据如下:

编号列1列2列3
1102515
230520
381250

CASE 表达式输出:

编号列1列2列3行最大值
110251525
23052030
38125050

👉 每行独立计算,返回该行的最大值。


如果要全部数据内比较(跨行+跨列)

需要在外层再包一层 MAX() 聚合函数:

-- 方法:先求每行最大,再求全局最大
SELECT MAX(行最大值) AS 全局最大值
FROM (
    SELECT 
        CASE 
            WHEN 列1 >= 列2 AND 列1 >= 列3 THEN 列1
            WHEN 列2 >= 列3 THEN 列2
            ELSE 列3
        END AS 行最大值
    FROM 数据表
) AS 子查询;

输出:

全局最大值
50

👉 整个表所有行、所有列中的最大值(只有一个结果)。


快速区分

代码特征比较类型结果数量
CASE ... END 直接在 SELECT 中同行比较每行一个结果
MAX(CASE ... END) 或外层包 MAX()全部数据比较单个结果
GREATEST(列1, 列2, 列3)同行比较每行一个结果
MAX(GREATEST(...))全部数据比较单个结果

总结

方法默认行为如何改为全局比较
CASE 表达式同行比较外层加 MAX()
GREATEST 函数同行比较外层加 MAX()
VALUES + MAX可同行可全局看是否加 GROUP BY

所以,CASE 表达式默认是同行比较,如果需要全部数据内比较,需要在外层再使用聚合函数 MAX()

相关文章

© 版权声明
THE END
喜欢就点赞吧
点赞9 分享