欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

sql数据分组(GROUP BY)最大值,第一条,前三条实例

程序员文章站 2022-04-08 10:33:59
...

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