mysql学生成绩排名,分组取前 N 条记录
转载 https://blog.csdn.net/jslcylcy/article/details/72627762
score表:
CREATE TABLE `score` (
`student_id` int(10) DEFAULT NULL,
`class_id` int(10) DEFAULT NULL,
`score` int(5) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
- 1
- 2
- 3
- 4
- 5
字段 student_id 学生 id ,class_id:班级 id ,score:分数
数据准备:
insert into score values(1,1,100),(2,1,93),(3,1,89),(4,1,96),(5,2,98),(6,2,97),(7,2,90),(8,2,88),(9,1,96);
表结构如下:
mysql> select * from score;
+------------+----------+-------+
| student_id | class_id | score |
+------------+----------+-------+
| 1 | 1 | 100 |
| 2 | 1 | 93 |
| 3 | 1 | 89 |
| 4 | 1 | 96 |
| 5 | 2 | 98 |
| 6 | 2 | 97 |
| 7 | 2 | 90 |
| 8 | 2 | 88 |
| 9 | 1 | 96 |
+------------+----------+-------+
9 rows in set (0.00 sec)
1.取每个班级前两名的学生(包含并列第二名)
mysql> select * from score s1 where (select count(0) from score s2 where s1.class_id = s2.class_id and s1.score < s2.score) < 2;
+------------+----------+-------+
| student_id | class_id | score |
+------------+----------+-------+
| 1 | 1 | 100 |
| 4 | 1 | 96 |
| 5 | 2 | 98 |
| 6 | 2 | 97 |
| 9 | 1 | 96 |
+------------+----------+-------+
5 rows in set (0.00 sec)
sql 解释:取表 s1的数据,这些数据中 class_id 和 s2 class_id相同的数据下,比 s1的 score 分数大的 s2的数据条目必须小于2
或者使用 left join 的方式:
mysql> select s1.* from score s1 left join score s2 on s1.class_id = s2.class_id and s1.score<s2.score group by s1.class_id,s1.student_id,s1.score having count(s2.student_id)<2;
+------------+----------+-------+
| student_id | class_id | score |
+------------+----------+-------+
| 1 | 1 | 100 |
| 4 | 1 | 96 |
| 9 | 1 | 96 |
| 5 | 2 | 98 |
| 6 | 2 | 97 |
+------------+----------+-------+
5 rows in set (0.00 sec)
2.取学生分数数据且表示排名
mysql> select s1.*,(select count(0) + 1 from score s2 where s2.score > s1.score)rank from score s1;
+------------+----------+-------+------+
| student_id | class_id | score | rank |
+------------+----------+-------+------+
| 1 | 1 | 100 | 1 |
| 2 | 1 | 93 | 6 |
| 3 | 1 | 89 | 8 |
| 4 | 1 | 96 | 4 |
| 5 | 2 | 98 | 2 |
| 6 | 2 | 97 | 3 |
| 7 | 2 | 90 | 7 |
| 8 | 2 | 88 | 9 |
| 9 | 1 | 96 | 4 |
+------------+----------+-------+------+
9 rows in set (0.00 sec)
sql解释:将 s2中比s1中分数大的条目显示出来就行了(count 时需要加1)
3.取学生成绩数据,表示班级排名
mysql> select s1.*,(select count(0) + 1 from score s2 where s1.class_id = s2.class_id and s2.score > s1.score)rank from score s1 order by class_id,rank;
+------------+----------+-------+------+
| student_id | class_id | score | rank |
+------------+----------+-------+------+
| 1 | 1 | 100 | 1 |
| 4 | 1 | 96 | 2 |
| 9 | 1 | 96 | 2 |
| 2 | 1 | 93 | 4 |
| 3 | 1 | 89 | 5 |
| 5 | 2 | 98 | 1 |
| 6 | 2 | 97 | 2 |
| 7 | 2 | 90 | 3 |
| 8 | 2 | 88 | 4 |
+------------+----------+-------+------+
9 rows in set (0.00 sec)
与之前一样,但过滤条件中只需要计算班级相同的数据条目
4.取每个班级前两名(并列的只取前面的数据)
mysql学生成绩排名,分组取前 N 条记录的更多相关文章
- ORACLE/MYSQL/DB2等不同数据库取前几条记录
选取数据库中记录的操作是最基础最频繁的,但往往实际应用中不会这么简单,会在选取记录的时候加上一些条件,比如取前几条记录,下面就总结了如何在ORACLE/MYSQL/DB2等一些热门数据库中执行取前几条 ...
- mysql使用GROUP BY分组实现取前N条记录的方法
MySQL中GROUP BY分组取前N条记录实现 mysql分组,取记录 GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY分组取前N条记录实现方法. 这是测试表(也不知道 ...
- MySql多表关联,根据某列取前N条记录问题
近来遇到一个问题:“MySql多表关联,根据某列取前N条记录”. 刚开始一直在想,SQL语句是否可以做到直接查询出来,但几经折磨,还是没能写出SQL语句,-------如果有大牛的话,望指点迷津.我把 ...
- MySQL中的RAND()函数使用详解(order by rand() 随机查询取前几条记录)
MySQL RAND()函数调用可以在0和1之间产生一个随机数: mysql> SELECT RAND( ), RAND( ), RAND( ); +------------------+--- ...
- oracle 取前10条记录
1.oracle 取前10条记录 1) select * from tbname where rownum < 11; 2) select * from (select * from tbnam ...
- Oracle 取前几条记录
今天看了篇文章,对oracle取前几条数据的方式和说明,总结比较全,学习了,做个记录点.oracle 取前10条记录 以下内容是原始文章内容,用于做留存阅读. 1.oracle 取前10条记录 1) ...
- 当前时间、前n天、后n天、取前n条记录、从第n条开始取m条
当前时间:NOW() 前n天:DATE_SUB(NOW(),INTERVAL n DAY) 后n天:DATE_SUB(NOW(),INTERVAL -n DAY) 取前n条记录:SELECT * FR ...
- mysql 分组统计、排序、取前N条记录解决方案
需要在mysql中解决记录的分组统计.排序,并抽取前10条记录的功能.现已解决,解决方案如下: 1)表结构 CREATE TABLE `policy_keywords_rel` ( `id` int( ...
- MSSQL—按照某一列分组后取前N条记录
以前在开发的时候遇到过一个需求,就是要按照某一列进行分组后取前几条数据,今天又有同事碰到了,帮解决了之后顺便写一篇博客记录一下. 首先先建一个基础数据表,代码如下: IF OBJECT_ID(N'Te ...
随机推荐
- tarjan算法求无向图的桥、边双连通分量并缩点
// tarjan算法求无向图的桥.边双连通分量并缩点 #include<iostream> #include<cstdio> #include<cstring> ...
- 【iOS】正則表達式抓取网页数据制作小词典
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/xn4545945/article/details/37684127 应用程序不一定要自己去提供数据. ...
- C#实现Web链接启动应用程序
C#实现Web链接启动应用程序 最近需要配合Web端实现用户点击链接来启动应用程序并且需要能够传参数给应用程序. 那么就可以使用注册表来实现这个功能 编写注册表可以在软件安装程序中加入,也可以在软件启 ...
- scipy.spatial.distance.cdist
scipy.spatial.distance.cdist(XA, XB, metric='euclidean', p=2, V=None, VI=None, w=None)[source] Compu ...
- springmvc中的参数接收
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import ...
- C#判断点是否在直线上
判断点在直线上,实际上就是判断点到直线上的垂直距离.点到直线垂直距离为0,则点在线上.当然也可以误差设置误差几个像素. 参考资料并进行修改:http://blog.sina.com.cn/s/blog ...
- scrapy 运行时报错 No module named _sqlite3
新服务器上运行scrapy时报错 exceptions.ImportError: No module named _sqlite3 原因 由于新的环境缺少sqlite的依赖,编译python3是虽然不 ...
- ui自动化之selenium操作(五)简单元素操作--续
1. 多窗口切换 有时候需要在多窗口切换,webdriver提供了switch_to_window()方法支持切换窗口: from selenium import webdriver import o ...
- squid之------安装与基本配置
1.rpm安装squid yum -y install squid 2.squid主要组成部分 服务名:squid 主程序:/usr/sbin/squid 配置目录:/etc/squid 主配置文件: ...
- 任意修改网页内容JS代码
浏览器输入框执行,chrome需要粘贴后,需要在前面手打javascript: 因为粘贴的会自动过滤 javascript:document.body.contentEditable='true'; ...