SQL中如何取多列的最大值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL中如何取多列的最大值?相关的知识,希望对你有一定的参考价值。

比如有个成绩表score,表里每个学生有三门课的成绩(chinese, maths, english),我想写一个sql,取每个学生成绩最高的那门课的分数,类似于:
select max(chinese, maths, english) from score
当然上一句是行不通的,max函数只能取该列的最大值,所以想请教该肿么做?

用max函数。

语法:

select max(字段1),max(字段2),max(字段3),max(字段4) from 表名

结果就是字段1,字段2,字段3,字段4分别的最大值,如果要查询其他字段的最大值,按照上述方式添加即可。

函数简介:

MAX() 函数

MAX 函数返回一列中的最大值。NULL 值不包括在计算中。

SQL MAX() 语法

SELECT MAX(column_name) FROM table_name

注释:MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。

参考技术A select max(high) as high ,studentid
from
(
select chinese as high,studentid from score
union all
select maths as high,studentid from score
union all
select english as high,studentid from score
) as highscore
group by studentid

这个效率有问题,但是能解决你的问题,再增加一门的话再union下就行了。
随便写的,没调,有错自己改下。
参考技术B 我在研究你的问题..正在测试..你等等再采纳..

经过测试,标准答案:
select case when chinese>maths and chinese>english then chinese
when maths>chinese and maths>english then maths
when english>chinese and english>maths then english
end
from test_score

这样更详细:
select case when chinese>maths and chinese>english then convert(nvarchar(5),chinese)+N'语文'
when maths>chinese and maths>english then convert(nvarchar(5),maths)+N'数学'
when english>chinese and english>maths then convert(nvarchar(5),english)+N'英语'
end
from test_score
参考技术C select
studentid,
chinese,
maths,
english,
(select max(t.a) from (select chinese as a union select maths union select english) t) as [最高分],
(select min(t.a) from (select chinese as a union select maths union select english) t) as [最低分]
from score
参考技术D 反正就3个

SELECT 学号, CASE WHEN chinese >= maths AND chinese >= english THEN chinese
WHEN maths >= chinese AND maths >= english THEN maths
WHEN english >= chinese AND english >= maths THEN english END
FROM score追问

额。。其实为了让问题易读,我简化了问题,实际情况有很多个字段。。。

追答

很多个问题,自己写个比较方法吧

SQL:当一列有最大/计数子查询时,我可以编写多列查询吗?

【中文标题】SQL:当一列有最大/计数子查询时,我可以编写多列查询吗?【英文标题】:SQL: Can I write query with multiple columns when one column has a max/count subquery? 【发布时间】:2021-09-16 01:36:42 【问题描述】:

这里是初学者。我写了如下SQL语句,返回记录没有问题。

SELECT COUNT(MAX(doc_line_num)) AS "TOTAL RECS"
FROM C_LAB
WHERE COMP_CODE = 'P1' AND OP_CODE = 'RMARTINEZ'
GROUP BY DOC_NUM

我的问题是.. 我可以用多列编写相同的查询吗?例如:

SELECT OP_CODE, COUNT(MAX(doc_line_num)) AS "TOTAL REC"
FROM C_LAB
WHERE COMP_CODE = 'P1' AND OP_CODE = 'CHRISTIANMONTALVO'
GROUP BY OP_CODE, DOC_NUM

我收到以下错误:

SQL 错误 [937] [42000]: ORA-00937: 不是单组分组函数

这不可能吗?还是我做错了什么?

【问题讨论】:

【参考方案1】:

首先,您使用的是 Oracle 提供的快捷方式。这个

SELECT COUNT(MAX(doc_line_num)) AS "TOTAL RECS"
FROM c_lab
WHERE comp_code = 'P1' AND op_code = 'RMARTINEZ'
GROUP BY doc_num;

等价于

SELECT COUNT(max_doc_line_num) AS "TOTAL RECS"
FROM
(
  SELECT doc_num, MAX(doc_line_num) AS max_doc_line_num
  FROM c_lab
  WHERE comp_code = 'P1' AND op_code = 'RMARTINEZ'
  GROUP BY doc_num
);

并最终计算具有 doc_line_num 的文档编号。

你也可以这样写

SELECT COUNT(DISTINCT doc_num) AS "TOTAL RECS"
FROM c_lab
WHERE comp_code = 'P1' AND op_code = 'RMARTINEZ' AND doc_line_num IS NOT NULL;

您的第二个查询相当于

SELECT op_code, COUNT(max_doc_line_num) AS "TOTAL RECS"
FROM
(
  SELECT op_code, doc_num, MAX(doc_line_num) AS max_doc_line_num
  FROM c_lab
  WHERE comp_code = 'P1' AND op_code = 'CHRISTIANMONTALVO'
  GROUP BY op_code, doc_num
);

这是无效的,因为在主查询中您聚合 (COUNT(max_doc_line_num)),但还选择了缺少 GROUP BY 子句或聚合的 op_code。

话虽如此,您可能正在寻找这个:

SELECT op_code, COUNT(max_doc_line_num) AS "TOTAL RECS"
FROM
(
  SELECT op_code, doc_num, MAX(doc_line_num) AS max_doc_line_num
  FROM c_lab
  WHERE comp_code = 'P1' AND op_code = 'CHRISTIANMONTALVO'
  GROUP BY op_code, doc_num
)
GROUP BY op_code
ORDER BY op_code;

但也许你想要一些完全不同的东西。我不知道。我的建议:不要使用 Oracle 的快捷方式在不使用子查询的情况下再次聚合所有聚合行。使用子查询,意图明确,不会发生此类语法错误。

【讨论】:

我非常感谢您的详细回复。这就是我一直在寻找的。​​span>

以上是关于SQL中如何取多列的最大值?的主要内容,如果未能解决你的问题,请参考以下文章

多列的SQL MAX?

怎么查询SQL数据库中一行多列的数据中最大值?

SQL多列查询最大值

sql server 2008中如何取某字段最大值所在的一条数据(多个字段)

SQL查询取分组最大值

SQL查询取分组最大值