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

作者:袖梨 2022-06-29

取分组前三第记录

 代码如下 复制代码

SELECT  课程,
        SUM(奖金) AS 奖金
FROM    ( SELECT    课程,
                    学号,
                    成绩
          FROM      考试 AS a
          WHERE     ( SELECT    COUNT(*)
                      FROM      考试
                      WHERE     课程 = a.课程
                                AND 学号 <> a.学号
                                AND 成绩 > a.成绩
                    ) < 3
        ) 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

相关文章

精彩推荐