日期:2014-05-18  浏览次数:20430 次

最大值查询,求解!
TB A

A1 A2
B1业务 12
B3业务 14
B1业务 52
B2业务 16
B1业务 12
B2业务 82
B2业务 14


需要查询 列A1 某业务 的 最大值A2
结果如:
B3业务 14
B1业务 52
B2业务 82

------解决方案--------------------
SQL code
select * from tb t
where A2=(select max(A2) from tb where A1=t.A1)

------解决方案--------------------
SQL code

select A1,max(A2) 'maxA2'
from TB 
group by A1

------解决方案--------------------
SQL code
select A1,max(A2)from A group by A1

------解决方案--------------------
探讨
1楼的效率,还是2楼的效率。执行

------解决方案--------------------
性能一样,从扩展性来看,似乎1楼会好点,比如还有一列A3(INT),仍然按A1分组,就不能用以下语句了
select A1,max(A2) 'maxA2',max(A3) 'maxA3'
from TB 
group by A1

另附上我自己的一种写法
SQL code

SELECT A1,A2 FROM 
(
SELECT A1,A2,ROW_NUMBER() OVER (PARTITION BY A1 ORDER BY A2 DESC) AS RowIndex FROM TBA
) X
WHERE RowIndex=1

------解决方案--------------------
探讨

1楼的效率,还是2楼的效率。执行

------解决方案--------------------
SQL code
use test
go

-->>>苦苦的潜行者
if object_id('tb') is not null
drop table tb
create table tb(A1 varchar(20),A2 int)
insert tb
select 'B1业务',12  union all
select 'B3业务',14  union all
select 'B1业务',52  union all
select 'B2业务',16  union all
select 'B1业务',12  union all
select 'B2业务',82  union all
select 'B2业务',14  

go

select A1,max(A2) as [最大量] from tb
group by A1
/*
(所影响的行数为 3 行)
A1    最大量
-----  ----
B1业务  52
B2业务  82
B3业务  14
*/
go
drop table tb

------解决方案--------------------
如果仅仅是两个字段分组求最大,则直接分组,使用max即可,所以2楼效率高.