转自:http://blog.163.com/jeson_lwj/blog/static/135761083201052411115783/

  1. --查询每门课程的前2名成绩
  2. CREATE TABLE StudentGrade(
  3. stuId CHAR(4), --学号
  4. subId INT, --课程号
  5. grade INT, --成绩
  6. PRIMARY KEY (stuId,subId)
  7. )
  8. GO
  9. --表中数据如下
  10. INSERT INTO StudentGrade(stuId,subId,grade) VALUES('001',1,97);
  11. INSERT INTO StudentGrade(stuId,subId,grade) VALUES('001',2,50);
  12. INSERT INTO StudentGrade(stuId,subId,grade) VALUES('001',3,70);
  13. INSERT INTO StudentGrade(stuId,subId,grade) VALUES('002',1,92);
  14. INSERT INTO StudentGrade(stuId,subId,grade) VALUES('002',2,80);
  15. INSERT INTO StudentGrade(stuId,subId,grade) VALUES('002',3,30);
  16. INSERT INTO StudentGrade(stuId,subId,grade) VALUES('003',1,93);
  17. INSERT INTO StudentGrade(stuId,subId,grade) VALUES('003',2,95);
  18. INSERT INTO StudentGrade(stuId,subId,grade) VALUES('003',3,85);
  19. INSERT INTO StudentGrade(stuId,subId,grade) VALUES('004',1,73);
  20. INSERT INTO StudentGrade(stuId,subId,grade) VALUES('004',2,78);
  21. INSERT INTO StudentGrade(stuId,subId,grade) VALUES('004',3,87);
  22. GO
  23. /*
  24. 要查询每门课程的前2名成绩
  25. 001 1 97
  26. 003 1 93
  27. 003 2 95
  28. 002 2 80
  29. 004 3 87
  30. 003 3 85
  31. 如何实现?
  32. */
  33. --查看数据
  34. select * from StudentGrade
  35.  
  36. --假如出现并列时,也只取两个同学的话。
  37. --方法一:
  38. select distinct *
  39. from studentgrade as t1
  40. where stuid in
  41. (select top 2 stuid
  42. from studentgrade as t2
  43. where t1.subid=t2.subid
  44. order by t2.grade desc)
  45. order by subid, grade desc
  46.  
  47. --方法二:
  48. select * from StudentGrade a where (select count(1) from studentGrade where subId=a.subId and grade>=a.grade)<=2
  49.  
  50. --方法三:
  51. select * from StudentGrade t
  52. where (select count(1) from StudentGrade where subid=t.subid and grade>t.grade)<=1
  53. order by subId,grade desc
  54.  
  55. --结果
  56. /*
  57. stuId subId grade
  58. ----- ----------- -----------
  59. 001 1 97
  60. 003 1 93
  61. 003 2 95
  62. 002 2 80
  63. 004 3 87
  64. 003 3 85
  65.  
  66. (6 row(s) affected)
  67. */
  68.  
  69. 共有三种方案,从难易程度上讲我倾向于后两种,从查询逻辑思想上来讲后两种是一样的
  70.  
  71. select * from StudentGrade t
  72. where (select count(1) from StudentGrade where subid=t.subid and grade>t.grade)<=1
  73. order by subId,grade desc
  74.  
  75. 我是这样理解的,看成两张表AB,条件为A表的学科=B表的学科,select count(1) from StudentGrade where subid=t.subid and grade>t.grade,返回A表的学科=B表的学科并且A表的成绩小于B表的成绩的影响行数,如果所影响的行数为零说明它的成绩是最高的,如果等于1的话就是最高的两个成绩。这就是查询条件,再按 subId,grade 排序。这种查询思想很值得我学习

  

sql 用Group by分组后,取每组的前几条记录的更多相关文章

  1. 用Group by分组后,取每组的前3条记录,怎么取?

    使用子查询进行查询 SELECT * FROM home_content a WHERE ( SELECT count(id) FROM home_content WHERE class_link = ...

  2. sql 分组后显示每组的前几条记录

    sql 分组后显示每组的前几条记录 如   表中记录是             code       serialno             A1               1           ...

  3. MySQL取每组的前N条记录

    一.对分组的记录取前N条记录:例子:取前 2条最大(小)的记录 .用子查询: SELECT * FROM right2 a WHERE > (SELECT COUNT(*) FROM right ...

  4. SQL,group by分组后分别计算组内不同值的数量

    select name as 姓名,sum( case when cargo='笔' then 1 else 0 end ) as 笔,sum( case when cargo='橡皮' then 1 ...

  5. 记一次有意思的 SQL 实现 → 分组后取每组的第一条记录

    开心一刻 今天,朋友气冲冲的走到我面前 朋友:我不是谈了个女朋友,谈了三个月嘛,昨天我偷看她手机,你猜她给我备注什么 我:备注什么? 朋友:舔狗 2 号! 我一听,气就上来了,说道:走,找她去,这婆娘 ...

  6. MSSQL 分组后取每组第一条(group by order by)

    查询中经常遇到这种查询,分组后取每组第一条.分享下一个SQL语句: --根据 x 分组后.根据 y 排序后取第一条 select * from ( select ROW_NUMBER() over(p ...

  7. sql 分组取每组的前n条或每组的n%(百分之n)的数据

    sql 分组取每组的前n条或每组的n%(百分之n)的数据 sql keyword: SELECT * ,ROW_NUMBER() OVER(partition by b.UserID order by ...

  8. 从排序后的结果集中删除 前n条记录

    端午有人休息,有人忙 操作前数据: --从排序后的结果集中删除 前n条记录delete from emp where empno in (select empno                   ...

  9. SQL实现group by 分组后组内排序

    在一个月黑风高的夜晚,自己无聊学习的SQL的时候,练习,突发奇想的想实现一个功能查询,一张成绩表有如下字段,班级ID,英语成绩,数据成绩,语文成绩如下图 实现 查询出 每个班级英语成绩最高的前两名的记 ...

随机推荐

  1. Springboot 静态资源

    说下默认映射的文件夹有: classpath:/META-INF/resources classpath:/resources classpath:/static classpath:/public ...

  2. stevedore动态加载模块

    stevedore动态加载模块,stevedore使用setuptools的entry points来定义并加载插件.entry point引用的是定义在模块中的对象,比如类.函数.实例等,只要在im ...

  3. Web前端js下载流文件

    前端下载文件大概有以下种: 1)a标签链接下载 <a href="url">点击链接下载</a> 2)表单form提交下载 var form = $(&qu ...

  4. metasploit framework(十五):弱点扫描

    openvas扫描生成NBE格式的日志 改个比较好记的文件名 将日志导入到msf进行后续操作,导入之前查看一下hosts和services 导入nbe格式的文件 查看漏洞弱点 msf直接调用nessu ...

  5. centos7.2 增加3T的XFS模式分区

    parted -l 查看分区情况与要分区的设备 # parted /dev/sda                   #选定要操作的硬盘     此时命令提示符会变成(parted)    (par ...

  6. 原生js,通过document.getElementByClassName获取元素的索引值

    let itemList = document.getElementsByClassName('sky-item') // 一行所有元素 let index = 0 for(let i = 0; i& ...

  7. HDU 6118 度度熊的交易计划(最小费用最大流)

    Problem Description度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个 ...

  8. UVa 10054 The Necklace(无向图欧拉回路)

    My little sister had a beautiful necklace made of colorful beads. Two successive beads in the neckla ...

  9. java实现rabbitMQ延时队列详解以及spring-rabbit整合教程

    在实际的业务中我们会遇见生产者产生的消息,不立即消费,而是延时一段时间在消费.RabbitMQ本身没有直接支持延迟队列功能,但是我们可以根据其特性Per-Queue Message TTL和 Dead ...

  10. QQ分享登陆报错

    linker command failed with exit code 1 (use -v to see invocation)报错原因 builtSetting下搜索 bitco 改为NO