当前位置: 代码迷 >> Sql Server >> SQL group by 统计有关问题MIN
  详细解决方案

SQL group by 统计有关问题MIN

热度:45   发布时间:2016-04-27 14:39:12.0
SQL group by 统计问题MIN求助

学生每天竞技比赛,赢了得分,输了负分,0表示当天没参加比赛。

现在我想求

比如2010/10/15 - 2010/11/16期间
每个学生的最低分,
获得这个最低分的日期,
每个学生获得各自最低分的日期之前获得的最高分
每个学生获得各自最低分的日期之后获得的最高分


日期 学号 姓名 成绩
2010/10/15 1 张三 12
2010/10/15 2 李四 -8
2010/10/15 3 王五 15
2010/10/16 1 张三 21
2010/10/16 2 李四 -22
2010/10/17 1 张三 12
2010/10/18 2 李四 -10
2010/10/19 3 王五 11
2010/11/16 1 张三 13
2010/11/18 3 王五 -23
2010/11/18 1 张三 19
2010/11/18 2 李四 0



希望求的表格:

学号 姓名 最低分 最低分日期 之前的最高分 之后的最高分

万分感谢各位大牛的帮助啊!!!!

------解决方案--------------------
SQL code
declare @t table (日期 datetime,学号 int,姓名 varchar(4),成绩 int)insert into @tselect '2010/10/15',1,'张三',12 union allselect '2010/10/15',2,'李四',-8 union allselect '2010/10/15',3,'王五',15 union allselect '2010/10/16',1,'张三',21 union allselect '2010/10/16',2,'李四',-22 union allselect '2010/10/17',1,'张三',12 union allselect '2010/10/18',2,'李四',-10 union allselect '2010/10/19',3,'王五',11 union allselect '2010/11/16',1,'张三',13 union allselect '2010/11/18',3,'王五',-23 union allselect '2010/11/18',1,'张三',19 union allselect '2010/11/18',2,'李四',0select  学号 ,        姓名 ,        成绩 as 最低分 ,        convert(varchar(10), 日期, 120) as 最低分日期 ,        ( select    max(成绩)          from      @t          where     日期 < m.日期                    and 学号 = m.学号        ) as 之前的最高分 ,        ( select    max(成绩)          from      @t          where     日期 > m.日期                    and 学号 = m.学号        ) 之后的最高分from    ( select    *          from      @t t          where     成绩 = ( select   min(成绩)                           from     @t b                           where    学号 = t.学号                         )        ) m/*学号          姓名   最低分         最低分日期      之前的最高分      之后的最高分----------- ---- ----------- ---------- ----------- -----------1           张三   12          2010-10-15 NULL        211           张三   12          2010-10-17 21          192           李四   -22         2010-10-16 -8          03           王五   -23         2010-11-18 15          NULL*/
------解决方案--------------------
SQL code
--日期 学号 姓名 成绩--2010/10/15 1 张三 12--2010/10/15 2 李四 -8--2010/10/15 3 王五 15--2010/10/16 1 张三 21--2010/10/16 2 李四 -22--2010/10/17 1 张三 12--2010/10/18 2 李四 -10--2010/10/19 3 王五 11--2010/11/16 1 张三 13--2010/11/18 3 王五 -23--2010/11/18 1 张三 19--2010/11/18 2 李四 0if OBJECT_ID('tb')is not nulldrop table tbgoCREATE TABLE tb(日期 varchar(50), 学号 int,姓名 varchar(50), 成绩 int)insert into tb values('2010/10/15' ,1 ,'张三' ,12)insert into tb values('2010/10/15', 2 ,'李四', -8)insert into tb values('2010/10/15', 3, '王五', 15)insert into tb values('2010/10/16', 1 ,'张三', 21)insert into tb values('2010/10/16', 2 ,'李四', -22)insert into tb values('2010/10/17' ,1 ,'张三', 12)insert into tb values('2010/10/18', 2 ,'李四', -10)insert into tb values('2010/10/19', 3, '王五', 11)insert into tb values('2010/11/16', 1 ,'张三', 13)insert into tb values('2010/11/18', 3, '王五', -23)insert into tb values('2010/11/18', 1, '张三', 19)insert into tb values('2010/11/18', 2 ,'李四', 0)--希望求的表格: --学号 姓名 最低分 最低分日期 之前的最高分 之后的最高分  select  学号,姓名,成绩 as 最低分, 日期 as 最低分日期 ,( select max(成绩) from tb where 日期 < s.日期 and 学号 = s.学号) 之前的最高分 ,( select max(成绩) from tb where 日期 > s.日期 and 学号 = s.学号) 之后的最高分from  ( select * from  tb t where  成绩=(select min(成绩) from tb b where 学号 = t.学号)) s学号          姓名                                                 最低分         最低分日期                                              之前的最高分      之后的最高分----------- -------------------------------------------------- ----------- -------------------------------------------------- ----------- -----------1           张三                                                 12          2010/10/15                                         NULL        211           张三                                                 12          2010/10/17                                         21          192           李四                                                 -22         2010/10/16                                         -8          03           王五                                                 -23         2010/11/18                                         15          NULL(4 行受影响)
  相关解决方案