查询语句,求一个字段的最大值,但最大值有多个,该怎么写代码?

时间:2022-06-15 14:07:28
select top 1 StudentID,Age
from Student as s 
order by Age desc 

这样只能求一个最大值,如何能求出多个最大值呢

12 个解决方案

#1


if object_id('test') is not null drop table test
go
create table test(StudentID int,Age int)
go
insert into test
select 1,25 union all
select 2,22 union all
select 3,27 union all
select 4,23 union all
select 5,27 union all
select 6,20 union all
select 7,19
go
select t.StudentID,t.Age
from
(
select rank() over(order by Age desc) rn,StudentID,Age from test
) t
where t.rn=1

/*

(7 行受影响)
StudentID   Age
----------- -----------
3           27
5           27

(2 行受影响)

*/

#2



--或者
select * from test
where Age=(select max(Age) from test)

#3


我试试

#4



declare @t table (StudentID int,Age int)
insert into @t
select 1,25 union all
select 2,22 union all
select 3,27 union all
select 4,23 union all
select 5,27 union all
select 6,20 union all
select 7,19
go
--select
select t.StudentID,t.Age
from
(
    select *,rank()over(order by Age desc)as rk from @t
 ) t
where t.rk=1


#5


借用一下#1的数据:


if object_id('test') is not null drop table test
go
create table test(StudentID int,Age int)
go
insert into test
select 1,25 union all
select 2,22 union all
select 3,27 union all
select 4,23 union all
select 5,27 union all
select 6,20 union all
select 7,19
go

select top 1 with ties * from test order by Age desc
/*
StudentID   Age
----------- -----------
3           27
5           27
*/

--SQL SERVER 2005 及其以上版本(含SQL SERVER 2005)可以使用

#6


该回复于2012-08-19 14:21:13被版主删除

#7


厉害啊

#8


引用 5 楼  的回复:
借用一下#1的数据:


SQL code

if object_id('test') is not null drop table test
go
create table test(StudentID int,Age int)
go
insert into test
select 1,25 union all
select 2,22 union all
select 3……

with ties写法不多见了啊
解释下:
WITH TIES 

指定从基本结果集中返回额外的行,对于 ORDER BY 列中指定的排序方式参数,这些额外的返回行的该参数值与 TOP n (PERCENT) 行中的最后一行的该参数值相同。只能在 SELECT 语句中且只有在指定了 ORDER BY 子句之后,才能指定 TOP...WITH TIES。

注意:返回的记录关联顺序是任意的。ORDER BY 不影响此规则

#9



我猜楼主是查询每个StudentID的最大Age吧

方法一:
select * from tb a
where not exists(
select 1 from tb b where a.StudentID=b.StudentID and a.Age<b.Age
)

方法二:
select * from tb a where age=(select max(age) from tb b where a.StudentID=b.StudentID)

方法三:

;with t
as(
select px=row_number(partition by StudentID order by age desc),
* from tb
)
select * from t where px=1


#10


use tempdb
go
--创建测试表
create table test
(
id int identity(1,1),
value int 
);

--插入测试数据
insert into test(value) values(10);
insert into test(value) values(10);
insert into test(value) values(2);
insert into test(value) values(3);
insert into test(value) values(4);
insert into test(value) values(5);
insert into test(value) values(7);
insert into test(value) values(8);

--查询
select * from test 
where value >= all(select max(value) from test)

#11


貌似很多人都忘了有:any、all、some这些关键字哦 查询语句,求一个字段的最大值,但最大值有多个,该怎么写代码?

#12


不用top 1,用where=最大的集合 

#1


if object_id('test') is not null drop table test
go
create table test(StudentID int,Age int)
go
insert into test
select 1,25 union all
select 2,22 union all
select 3,27 union all
select 4,23 union all
select 5,27 union all
select 6,20 union all
select 7,19
go
select t.StudentID,t.Age
from
(
select rank() over(order by Age desc) rn,StudentID,Age from test
) t
where t.rn=1

/*

(7 行受影响)
StudentID   Age
----------- -----------
3           27
5           27

(2 行受影响)

*/

#2



--或者
select * from test
where Age=(select max(Age) from test)

#3


我试试

#4



declare @t table (StudentID int,Age int)
insert into @t
select 1,25 union all
select 2,22 union all
select 3,27 union all
select 4,23 union all
select 5,27 union all
select 6,20 union all
select 7,19
go
--select
select t.StudentID,t.Age
from
(
    select *,rank()over(order by Age desc)as rk from @t
 ) t
where t.rk=1


#5


借用一下#1的数据:


if object_id('test') is not null drop table test
go
create table test(StudentID int,Age int)
go
insert into test
select 1,25 union all
select 2,22 union all
select 3,27 union all
select 4,23 union all
select 5,27 union all
select 6,20 union all
select 7,19
go

select top 1 with ties * from test order by Age desc
/*
StudentID   Age
----------- -----------
3           27
5           27
*/

--SQL SERVER 2005 及其以上版本(含SQL SERVER 2005)可以使用

#6


该回复于2012-08-19 14:21:13被版主删除

#7


厉害啊

#8


引用 5 楼  的回复:
借用一下#1的数据:


SQL code

if object_id('test') is not null drop table test
go
create table test(StudentID int,Age int)
go
insert into test
select 1,25 union all
select 2,22 union all
select 3……

with ties写法不多见了啊
解释下:
WITH TIES 

指定从基本结果集中返回额外的行,对于 ORDER BY 列中指定的排序方式参数,这些额外的返回行的该参数值与 TOP n (PERCENT) 行中的最后一行的该参数值相同。只能在 SELECT 语句中且只有在指定了 ORDER BY 子句之后,才能指定 TOP...WITH TIES。

注意:返回的记录关联顺序是任意的。ORDER BY 不影响此规则

#9



我猜楼主是查询每个StudentID的最大Age吧

方法一:
select * from tb a
where not exists(
select 1 from tb b where a.StudentID=b.StudentID and a.Age<b.Age
)

方法二:
select * from tb a where age=(select max(age) from tb b where a.StudentID=b.StudentID)

方法三:

;with t
as(
select px=row_number(partition by StudentID order by age desc),
* from tb
)
select * from t where px=1


#10


use tempdb
go
--创建测试表
create table test
(
id int identity(1,1),
value int 
);

--插入测试数据
insert into test(value) values(10);
insert into test(value) values(10);
insert into test(value) values(2);
insert into test(value) values(3);
insert into test(value) values(4);
insert into test(value) values(5);
insert into test(value) values(7);
insert into test(value) values(8);

--查询
select * from test 
where value >= all(select max(value) from test)

#11


貌似很多人都忘了有:any、all、some这些关键字哦 查询语句,求一个字段的最大值,但最大值有多个,该怎么写代码?

#12


不用top 1,用where=最大的集合