翼度科技»论坛 编程开发 mysql 查看内容

MySQL5.7实现row_number()和over()函数

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
一、创建测试数据库 db_test
  1. -- 创建测试数据库 db_test
  2. CREATE DATABASE /*!32312 IF NOT EXISTS*/`db_test` /*!40100 DEFAULT CHARACTER SET utf8 */;
复制代码
二、使用 db_test 数据库
  1. -- 使用 db_test 数据库
  2. USE `db_test`; /*Table structure for table `test1` */
复制代码
三、先删除测试表看看
  1. -- 先删除测试表看看
  2. DROP TABLE IF EXISTS `test1`;
复制代码
四、创建测试表
  1. -- 创建测试表
  2. CREATE TABLE `test1` (
  3.   `id` int(10) NOT NULL,
  4.   `score` int(20) DEFAULT NULL,
  5.   `class` char(10) COLLATE utf8_bin DEFAULT NULL,
  6.   `name` char(20) COLLATE utf8_bin DEFAULT NULL,
  7.   PRIMARY KEY (`id`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
复制代码
五、测试表刷数
  1. -- 测试表刷数
  2. /*Data for the table `test1` */
  3. insert into `test1`(`id`,`score`,`class`,`name`) values
  4. (1,100,'语文','张三'),
  5. (2,98,'语文','李四'),
  6. (3,98,'语文','王五'),
  7. (4,98,'数学','张三'),
  8. (5,96,'数学','李四'),
  9. (6,92,'数学','王五'),
  10. (7,85,'数学','张三'),
  11. (8,96,'语文','张三'),
  12. (9,96,'语文','张三'),
  13. (10,91,'语文','张三'),
  14. (11,91,NULL,'张三');
复制代码
六、查询测试表
  1. -- 查询测试表
  2. select * from test1;
复制代码
七、MySQL5.7实现 row_number() over()函数的功能
  1. -- MySQL5.7实现 row_number() over()函数的功能
  2. SELECT id
  3.       ,class
  4.       ,score
  5.       ,rank
  6.   FROM (SELECT b.*
  7.               -- 定义用户变量 @rownum 来记录数据的行号。通过赋值语句 @rownum := @rownum + 1 来累加达到递增行号。
  8.               ,@rownum := @rownum+1
  9.               -- 如果当前分组编号和上一次分组编号相同,则 @rank (对每一组的数据进行编号)值加1,否则表示为新的分组,从1开始
  10.               ,IF(@pdept = b.class, @rank := @rank + 1, @rank := 1) AS rank
  11.               -- 定义变量 @pdept 用来保存上一次的分组id
  12.               ,@pdept := b.class
  13.               -- 这里的排序不确定是否需要,保险点还是加上吧
  14.           FROM (SELECT * FROM test1 a ORDER BY a.class, a.score DESC) b
  15.               -- 初始化自定义变量值
  16.               ,(SELECT @rownum :=0, @pdept := NULL, @rank:=0) c
  17.          -- 该排序必须,否则结果会不对
  18.          ORDER BY b.class, b.score DESC) result
  19. order by class, rank;
复制代码
到此这篇关于MySQL5.7实现row_number() over()函数的文章就介绍到这了,更多相关MySQL5.7 row_number() over()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/database/322103vxl.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具