经常进行数据分析的小伙伴经常会需要生成序号或进行数据分组排序并生成序号 。在MySQL8.0中可以使用窗口函数来实现,可以参考历史文章有了这些函数,统计分析事半功倍进行了解 。而MySQL5.7中由于没有这类函数,该如何实现呢,下面对比MySQL8.0,列举两种情况的实现 。
1、数据准备创建一张演示表:
#创建表CREATE TABLE users (id INT PRIMARY KEY,group_id INT,c_name VARCHAR(64));
插入演示数据:
-- 插入10行数据INSERT INTO users VALUES (1, 1, '张三');INSERT INTO users VALUES (2, 1, '李四');INSERT INTO users VALUES (3, 2, '王五');INSERT INTO users VALUES (4, 2, '赵六');INSERT INTO users VALUES (5, 3, '钱七');INSERT INTO users VALUES (6, 1, '周八');INSERT INTO users VALUES (7, 2, '吴九');INSERT INTO users VALUES (8, 3, '郑十');INSERT INTO users VALUES (9, 1, '孙十一');INSERT INTO users VALUES (10, 3, '李十二');
2、生成序号 (1)使用窗口函数ROW_NUMBER()实现在MySQL8.0中可以直接使用窗口函数ROW_NUMBER()来实现序号的生成,例如:
# 根据c_name字段进行排序生成序号SELECTROW_NUMBER() OVER (ORDER BY c_name) AS row_num,id,c_nameFROMusers;
结果如下:
+---------+----+-----------+| row_num | id | c_name|+---------+----+-----------+|1 |7 | 吴九||2 |6 | 周八||3 |9 | 孙十一||4 |1 | 张三||5 | 10 | 李十二||6 |2 | 李四||7 |3 | 王五||8 |4 | 赵六||9 |8 | 郑十||10 |5 | 钱七|+---------+----+-----------+10 rows in set, 1 warning (0.00 sec)
文章插图
(2)低版本MySQL中的实现因为在MySQL8.0版本之前无ROW_NUMBER()窗口函数,因此需要结束变量来实现 。具体示例如下:
SET @row_num = 0;SELECT(@row_num:=@row_num + 1) AS row_num,id, c_nameFROMusersORDER BYc_name;
结果如下:+---------+----+-----------+| row_num | id | c_name|+---------+----+-----------+|1 |7 | 吴九||2 |6 | 周八||3 |9 | 孙十一||4 |1 | 张三||5 | 10 | 李十二||6 |2 | 李四||7 |3 | 王五||8 |4 | 赵六||9 |8 | 郑十||10 |5 | 钱七|+---------+----+-----------+10 rows in set, 1 warning (0.00 sec)
文章插图
注意:每次执行前需要将@row_num重新设置为0 ,即执行SET @row_num = 0 。
3、分组后排序(1)继续使用窗口函数ROW_NUMBER()实现在MySQL8.0中可以继续使用窗口函数ROW_NUMBER()来实现分组排序的功能,例如:
SELECTid,group_id,c_name,ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY id) AS row_numFROMusersORDER BYgroup_id, id;
运行结果如下:+----+----------+-----------+---------+| id | group_id | c_name| row_num |+----+----------+-----------+---------+|1 |1 | 张三|1 ||2 |1 | 李四|2 ||6 |1 | 周八|3 ||9 |1 | 孙十一|4 ||3 |2 | 王五|1 ||4 |2 | 赵六|2 ||7 |2 | 吴九|3 ||5 |3 | 钱七|1 ||8 |3 | 郑十|2 || 10 |3 | 李十二|3 |+----+----------+-----------+---------+10 rows in set (0.00 sec)
文章插图
(2)低版本MySQL中的实现因为涉及到分组及分组后排序 , 因此需要引入2个变量,一个用于分组标识 , 一个用于组内排序标识,示例如下:
SET @row_num = 0;SET @g_id = NULL;SELECTid,group_id,c_name,@row_num := CASEWHEN @g_id = group_id THEN @row_num + 1ELSE 1END AS row_num,@g_id := group_id AS v_gidFROMusersORDER BYgroup_id, id;
运行结果如下:+----+----------+-----------+---------+-------+| id | group_id | c_name| row_num | v_gid |+----+----------+-----------+---------+-------+|1 |1 | 张三|1 |1 ||2 |1 | 李四|2 |1 ||6 |1 | 周八|3 |1 ||9 |1 | 孙十一|4 |1 ||3 |2 | 王五|1 |2 ||4 |2 | 赵六|2 |2 ||7 |2 | 吴九|3 |2 ||5 |3 | 钱七|1 |3 ||8 |3 | 郑十|2 |3 || 10 |3 | 李十二|3 |3 |+----+----------+-----------+---------+-------+10 rows in set, 2 warnings (0.00 sec)
文章插图
这样就实现了分组及排序的序号生成 。
【MySQL数据库如何生成分组排序的序号】
推荐阅读
- 一篇文章,彻底理解数据库操作语言:DDL、DML、DCL、TCL
- 什么是传销罪如何判定 什么是传销
- PS中如何解开合并图层,ps要咋滴才可以分开合并的图层
- 怎么设置微信的密码才可以看到零钱 微信如何设置密码才能看钱包
- 2021最新版qq怎么关闭qq看点消息 如何关闭qq看点里的消息
- 如何设置腾讯视频弹幕
- 徐娇发微博晒健身成果,大方晒白皙皮肤让不少网友惊“如何保养”
- 如何消除口臭12种方法 如何消除口臭
- 如何快速去眼袋和黑眼圈 如何快速去眼袋
- 如何看房子风水好坏 如何看房子风水