sql数据分组最大值,第一条,前三条方法总结,三个实例都比较简单都是根据group by出来的数据进行一些简单操作即可,有需要的同学可参考一下.
取分组前三第记录
代码如下 复制代码
select 课程,
sum(奖金) as 奖金
from ( select 课程,
学号,
成绩
from 考试 as a
where ( select count(*)
from 考试
where 课程 = a.课程
and 学号 a.学号
and 成绩 > a.成绩
) ) as b
group by 课程
取分组第一第记录
例
表demo的数据都是字符串类型,按照顺序的时间time(也是字符串)排序的记录如下:
num name time
1 a 2009/05/01
1 a 2009/05/02
1 a 2009/05/03
2 b 2009/05/04
2 b 2009/05/05
3 c 2009/05/06
3 c 2009/05/07
5 e 2009/05/08
1 a 2009/05/09
1 a 2009/05/10
我想输出类似按照num分组的每组的第一条数据记录,比如上面的记录我想操作后得到如下记录:
num name time
1 a 2009/05/01
2 b 2009/05/04
3 c 2009/05/06
5 e 2009/05/08
1 a 2009/05/09
sql代码
代码如下 复制代码
declare @tab table
(num int, name varchar(2), time datetime)
insert into @tab select 1 ,'a', '2009/05/01'
insert into @tab select 1 ,'a', '2009/05/02'
insert into @tab select 1 ,'a', '2009/05/03'
insert into @tab select 2 ,'b', '2009/05/04'
insert into @tab select 2 ,'b', '2009/05/05'
insert into @tab select 3 ,'c', '2009/05/06'
insert into @tab select 3 ,'c', '2009/05/07'
insert into @tab select 5 ,'e', '2009/05/08'
insert into @tab select 1 ,'a', '2009/05/09'
insert into @tab select 1 ,'a', '2009/05/10'
select * from @tab t where not exists(select 1 from @tab where num=t.num and [time]/*
num name time
----------- ---- -----------------------
1 a 2009-05-01 00:00:00.000
2 b 2009-05-04 00:00:00.000
3 c 2009-05-06 00:00:00.000
5 e 2009-05-08 00:00:00.000
(4 行受影响)
*/
取分组最大记录
示例:test 表 a b c
1 5 abc
2 6 bcd
1 7 ade
2 8 adc
若取按a列分组后,b列最大,的所有列的记录:
result a b c
1 6 bcd
2 8 adc
可以使用如下语句:
代码如下 复制代码
select * from test where b in (select max(id) from test group by a)
适用于所有数据库:
select t1.a,t1.b,t1.c
from test t1
inner join
(seelct a,max(b) as b from test group by a) t2
on t1.a=t2.a and t1.b=t2.b
适用于所有数据库:
select a,b,c
from(
select a,b,c
,row_number()over(partition by a order by b desc) rn
from test
)
where rn=1