问题来源于此贴:如何通过定时任务写入的扩展表数据,最大值成功获取。 – 服务中心
这里对解决方法做一记录,方便日后使用
📌 两种场景的区别
| 场景 | 描述 | 使用函数 |
|---|---|---|
| 行内最大值 | 同一行的多列之间比较 | 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;
转化到WorkFine内,使用组合视图然后使用最大值(MAX)函数取值
或者使用 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;
📊 完整示例对比
假设表数据如下:
| ID | Col1 | Col2 | Col3 |
|---|---|---|---|
| 1 | 10 | 25 | 15 |
| 2 | 30 | 5 | 20 |
| 3 | 8 | 12 | 50 |
-- 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 + MAX 或 MAX(GREATEST(...)) |
| 分组后多行多列最大值 | CROSS APPLY + VALUES + GROUP BY |
核心区别:
GREATEST= 横向比较(同一行,多列)MAX= 纵向比较(同一列,多行)- 多行多列 = 先横向再纵向,或先转成单列再纵向聚合
PS:最小值也是同理的


请登录后查看回复内容