如何在SQL中查找最大值及其关联的字段值?

时间:2011-06-01 04:50:43

标签: sql

说我有学生姓名及其分数的清单。我想找出最高分和学生,我怎么能写一个选择陈述来做到这一点?

7 个答案:

答案 0 :(得分:7)

假设你的意思是标记而不是备注,请使用:

select name, mark
from students
where mark = (
    select max(mark)
    from students
)

这通常会导致相当有效的查询。子查询应该只执行一次(除非你的DBMS死脑)并将结果输入第二个查询。您可能希望确保在mark列上有索引。

答案 1 :(得分:2)

如果您不想使用子查询:

SELECT name, remark
FROM students
ORDER BY remark DESC
LIMIT 1

答案 2 :(得分:1)

select name, remarks 
from student 
where remarks =(select max(remarks) from student)

答案 3 :(得分:0)

如果您使用的是支持窗口的数据库,

SELECT name, mark FROM
(SELECT name, mark, rank() AS rk 
 FROM student_marks OVER (ORDER BY mark DESC)
) AS subqry
WHERE subqry.rk=1;

这可能的运行速度与mark=(SELECT MAX(mark)...样式查询一样快,但值得一试。

答案 4 :(得分:0)

在SQL Server中:

SELECT TOP 1 WITH TIES *
FROM Students
ORDER BY Mark DESC

这将返回所有具有最高分数的学生,无论是只有一个还是多个。如果只想要一行,请删除WITH TIES说明符。 (但实际行并不保证总是相同。)

答案 5 :(得分:0)

您可以创建视图并将其与原始表连接:

V1
select id , Max(columName)
from t1
group by id

select * from t1
where t1.id = V1.id and t1.columName = V1.columName

如果您需要带有相关信息的最大值

,这是正确的

答案 6 :(得分:0)

我最近需要与这篇文章“类似”的东西,并希望分享一种技术。假设您有一个Order和OrderDetail表,并且您希望从Order表返回信息以及与价格最高的详细信息行关联的产品名称。这是一种在没有子表,RANK等的情况下实现这一目标的方法。关键是创建和聚合将详细表中的键和值组合在一起,然后只对其进行最大化并将您想要的值子串出来。

create table CustOrder(ID int)
create table CustOrderDetail(OrderID int, Price money, ProdName varchar(20))    
insert into CustOrder(ID) values(1)
insert into CustOrderDetail(OrderID,Price,ProdName) values(1,10,'AAA')
insert into CustOrderDetail(OrderID,Price,ProdName) values(1,50,'BBB')
insert into CustOrderDetail(OrderID,Price,ProdName) values(1,10,'CCC')

select 
    o.ID,
    JoinAggregate=max(convert(varchar,od.price)+'*'+od.prodName),
    maxProd=
        SUBSTRING(
            max(convert(varchar,od.price)+'*'+od.prodName)
            ,CHARINDEX('*',max(convert(varchar,od.price)+'*'+convert(varchar,od.prodName))
    )+1,9999)
from
    CustOrder o
    inner join CustOrderDetail od on od.orderID = o.ID
group by
    o.ID

enter image description here