原文链接 :https://www.jianshu.com/p/69699e412d37
(保存内容以免原文丢失)

表结构
create table Grade (StudentName varchar2(50),CourseName varchar2(100),Grade number
);
插入数据
INSERT INTO grade (StudentName, CourseName, Grade)
VALUES ('John Smith', 'English', 76);INSERT INTO grade (StudentName, CourseName, Grade)
VALUES ('John Wall', 'Math', 86);INSERT INTO grade (StudentName, CourseName, Grade)
VALUES ('Kobe Byrant', 'Math', 90);INSERT INTO grade (StudentName, CourseName, Grade)
VALUES ('Will Smith', 'English', 96);INSERT INTO grade (StudentName, CourseName, Grade)
VALUES ('Li Lei', 'Math', 99);INSERT INTO grade (StudentName, CourseName, Grade)
VALUES ('Tim Duncan', 'English', 95);COMMIT;

思路

这里的解决方案是做一个自连接(连接条件:t.CourseName = tt.CourseName AND tt.grade >= t.grade),查找比当前记录分数高的记录只有一条的记录(这一条自然就是记录本身了)。自连接之后的筛选方法是,先按照t.StudentName, t.CourseName分组,然后,筛选出只有一条记录的组就好了

自连接SQL v1.0
SELECT t.StudentName,t.CourseName
FROM Grade t,Grade tt
WHERE t.CourseName = tt.CourseNameAND tt.grade >= t.grade
GROUP BY t.StudentName,t.CourseName
HAVING count(1) <= 1

自连接SQL v2.0

前面的结果中,没法看到各个科目成绩最高的学生的分数,因为分数字段没有出现在group by表达式中。
这个非常好解决,不会有相同StudentName和CourseName,但是成绩不同的情况,所以,直接在group by子句中加上这个字段就行。如下

SELECT t.CourseName,t.StudentName,t.grade
FROM Grade t,Grade tt
WHERE t.CourseName = tt.CourseNameAND tt.grade >= t.grade
GROUP BY t.StudentName,t.CourseName,t.grade
HAVING count(1) <= 1

查询各个科目的成绩排名

根据这个原理,可以很容易地查询各个科目的成绩排名。
自连接之后,有多少条比当前记录大的(实际是大于等于),就认为排名是第几。

SELECT t.CourseName,t.StudentName,t.grade,count(1) CourseRank
FROM Grade t,Grade tt
WHERE t.CourseName = tt.CourseNameAND tt.grade >= t.grade
GROUP BY t.StudentName,t.CourseName,t.grade
order by t.CourseName, CourseRank

说明

MySql中应该也有GROUP_CONCAT聚合函数能够配合SUBSTRING_INDEX截取函数可以实现类似功能

SQL分组查询找组内最大相关推荐

  1. sql分组查询每组最新一条数据

    在开发过程中,写sql语句时往往会遇到分类查询最新的一条数据或某一列最大数据,此时就需要用到连表查询和分组查询, 先分组查询出每组最大的id,再进行连表查询 SELECT id,title,u_id, ...

  2. sql分组查询每组最新的一条数据

    原文地址:https://www.cnblogs.com/java-spring/p/11498457.html 开发中经常会遇到,分组查询最新数据的问题,比如下面这张表(查询每个地址最新的一条记录) ...

  3. Mysql分组查询每组最新的一条数据(三种实现方法)

    MySQL分组查询每组最新的一条数据 前言 注意事项 准备SQL 错误查询 错误原因 方法一 方法二(适用于自增ID和创建时间排序一致) 方法三(适用于自增ID和创建时间排序一致) 总结 MAX()函 ...

  4. GROUP BY 分组后显示组内所有数据

    GROUP BY 分组后显示组内所有数据 数据表中需要根据某一个字段进行分组,但需要显示分组后组内的所有数据.两种方式: 1.数据表自己和自己进行连接查询,连接条件就是需要分组的字段,但这种方式查询出 ...

  5. Pandas 统计分析基础 笔记4 任务4.4 使用分组聚合进行组内计算

    文章目录 pandas_任务4.4 使用分组聚合进行组内计算 4.4.1 使用groupby方法拆分数据 代码 4-51 对菜品订单详情表依据订单编号分组 代码 4-52 GroupBy 类求均值,标 ...

  6. SQL分组查询后取每组的前N条记录

    本文由 Leon 同学授权发布 这个公众号的关注者除了大部分是 Android 工程师之外还有部分后端以及前端同学,我鼓励也非常欢迎大家来投稿,其实我们并不需要把自己限定在某个领域,多学学其他语言也是 ...

  7. sql里查询一个组和组的用户数怎么查?_【牛客网SQL刷题】留存率怎么算?

    抽空刷了牛客网SQL实战72题,最后几道以牛客网为例的题目还挺有挑战性,在此记录 统计时间段新用户次日留存率 每日的次日留存率 每日的新用户数 每日新用户的次日留存 求新登录用户次日留存 表login ...

  8. sql分组查询的使用

    理解group by语义 个人认为sql中的group by和join是两大难点,因为它们转换了原来的表结构,group把表按某些字段统计缩小,join则使用笛卡尔积将多个表连接展开(关于表的连接,请 ...

  9. 深入理解sql分组查询(group by)

    理解group by语义 个人认为sql中的group by和join是两大难点,因为它们转换了原来的表结构,group把表按某些字段统计缩小,join则使用笛卡尔积将多个表连接展开(关于表的连接,请 ...

最新文章

  1. Go 学习笔记(80)— Go 标准库 container/list(单链表、双链表)
  2. 2048游戏-AI程序算法分析
  3. RocketMQ源码分析之RocketMQ事务消息实现原理上篇(二阶段提交)
  4. 使用UI Automation实现自动化测试 --工具使用
  5. mysql sql select_mysql SQL Select 语句 简单应用
  6. asp.net 获取计算机配置_智能制造中的计算机视觉应用瓶颈问题
  7. [转]UART 基础知识
  8. 虚拟机中部署ISA Server 2006 防火墙 网络设置(上)
  9. 群体智能优化算法之猫群算法(Cat Swarm Optimization)
  10. 十五届恩智浦智能车-四十天做四轮-调车日记
  11. spoon mysql教程_Kettle-Spoon入门示例
  12. office 论文 页码_毕业论文页码格式word操作
  13. java.lang.IllegalStateException: Failed to convert message:‘‘ to outbound message.
  14. Notepad++ json 插件 Jsonviewer2 无法使用问题
  15. HEIC格式怎么转换?掌握这个方法,轻松实现!
  16. 个人总结 高阶PLSQL 数据库编程
  17. 产品必备技能(十一):如何写产品分析报告?附实产品分析报告实例(闲鱼)
  18. 权限检查authority-check
  19. vim:vim从入门到放弃
  20. 空间点到直线距离的一种解法

热门文章

  1. iqooz6和iqooneo6se区别 iqoo z6和iqoo neo6se哪个好
  2. jQuery库 之 jquery slimscroll插件使用
  3. Css实现省略号...及悬浮层显示全部内容的方法:
  4. Web Services 接口大全
  5. 【技巧】windows下网络抓包-netsh技巧(文末附免费学习资料)
  6. 计算机毕业设计SSM服装创意定制管理系统【附源码数据库】
  7. iotop - 如何在 Linux 中监控磁盘 I/O
  8. 传统奢侈品行业的确过得艰辛
  9. 华为Matebook14 预装office 重新安装
  10. vim 设置多行缩进多个空格