MySQL 5.7分组排序

创建一张测试数据表,模拟MySQL5.7 全表排序加序号和分组排序加序号

sql 复制代码
CREATE TABLE `zm_one` (
  `id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `dept_code` varchar(255) DEFAULT NULL COMMENT '部门编码',
  `dept_name` varchar(255) DEFAULT NULL COMMENT '部门名称',
  `emp_code` varchar(255) DEFAULT NULL COMMENT '员工编码',
  `emp_name` varchar(255) DEFAULT NULL COMMENT '员工姓名',
  `sale_amount` decimal(10,2) DEFAULT NULL COMMENT '销售金额',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4;

表数据如下:

测试如下条件:

1 全表排序,按照销售金额从大到小排序,添加序号;

2 全表排序,按照销售金额从大到小排序,添加序号,金额相同,序号相同;

3 全表排序,按照销售金额从大到小排序,添加序号,金额相同,序号相同,后续序号发生跳跃;

4 分组排序,按照销售金额从大到小排序,添加序号;

5 分组排序,按照销售金额从大到小排序,添加序号,金额相同,序号相同;

6 分组排序,按照销售金额从大到小排序,添加序号,金额相同,序号相同,后续序号发生跳跃;

一 条件1

全表排序,按照销售金额从大到小排序,添加序号:

查询sql:

sql 复制代码
select dept_name, emp_name, sale_amount, (@row_order := @row_order + 1)  as row_index
from
(select dept_name, emp_name, sale_amount from zm_one order by sale_amount desc) a,
(select @row_order := 0) b

查询结果:

二 条件2

全表排序,按照销售金额从大到小排序,添加序号,金额相同,序号相同:

查询sql:

sql 复制代码
select 
	dept_name, emp_name, sale_amount, row_number
from
(select 
	dept_name, emp_name, sale_amount, 
	@row_order := IF(@pre_val = sale_amount, @row_order, @row_order + 1) as row_number,
	@pre_val := sale_amount
from
	(select dept_name, emp_name, sale_amount from zm_one order by sale_amount desc) a,
	(select @row_order := 0, @pre_val := NULL) b
) c

查询结果:

三 条件3

全表排序,按照销售金额从大到小排序,添加序号,金额相同,序号相同,后续序号发生跳跃:

查询sql:

sql 复制代码
select dept_name, emp_name, sale_amount, row_number
from
(select 
	dept_name, emp_name, sale_amount, 
	@row_order := IF(@pre_val = sale_amount, @row_order, @row_count) as row_number,
	@pre_val := sale_amount,
	@row_count := @row_count + 1
from
	(select dept_name, emp_name, sale_amount from zm_one order by sale_amount desc) a,
	(select @row_order := 0, @row_count := 1, @pre_val := NULL) b
) c

查询结果:

四 条件4

分组排序,按照销售金额从大到小排序,添加序号:

查询sql:

sql 复制代码
select dept_name, emp_name, sale_amount, row_number
from
(select dept_code, dept_name, emp_name, sale_amount, @row_order := IF(@group_val = dept_code, @row_order + 1, 1) as row_number, @group_val := dept_code
from
	(select dept_code, dept_name, emp_name, sale_amount from zm_one order by dept_code, sale_amount desc) a,
	(select @row_order := 0, @group_val := NULL) b
) c

查询结果:

五 条件5

分组排序,按照销售金额从大到小排序,添加序号,金额相同,序号相同:

查询sql:

sql 复制代码
select dept_name, emp_name, sale_amount, row_number
from
(select dept_code, dept_name, emp_name, sale_amount, @row_order := IF(@group_val = dept_code, IF(@pre_val = sale_amount, @row_order, @row_order + 1), 1) as row_number, @group_val := dept_code, @pre_val := sale_amount
 from
	(select dept_code, dept_name, emp_name, sale_amount from zm_one order by dept_code, sale_amount desc) a,
	(select @row_order := 0, @group_val := NULL, @pre_val := NULL) b
) c

查询结果:

六 条件6

分组排序,按照销售金额从大到小排序,添加序号,金额相同,序号相同,后续序号发生跳跃:

查询sql:

sql 复制代码
select dept_name, emp_name, sale_amount, row_number
from
(select dept_code, dept_name, emp_name, sale_amount, 
@row_order := IF(@group_val = dept_code, IF(@pre_val = sale_amount, @row_order, @row_count), 1) as row_number, 
@row_count := IF(@group_val = dept_code, @row_count + 1, 2),
@group_val := dept_code, 
@pre_val := sale_amount
 from
	(select dept_code, dept_name, emp_name, sale_amount from zm_one order by dept_code, sale_amount desc) a,
	(select @row_order := 0, @group_val := NULL, @row_count := 0, @pre_val := NULL) b
) c

查询结果:

使用用户自定义变量在当前会话生效,在分组排序,按照销售金额从大到小排序,添加序号,金额相同,序号相同,后续序号发生跳跃,创建了四个变量:

@row_order变量代表当前行记录的序号;

@group_val变量区分分组的字段;

@row_count变量表示下一条行记录的序号;

@pre_val变量记录当前行排序的字段,用于下一条记录的比较;

相关推荐
wuyk55536 分钟前
Spider-第10讲-SQLite持久化与去重
数据库·爬虫·sqlite
乌暮2 小时前
Spring AOP 与 Spring 事务:用大白话彻底理解原理与实践
java·数据库·spring boot·后端·sql·学习·spring
小此方3 小时前
Re:Mysql数据库基础篇(十二):什么是事务、事务解决了什么问题、事务的四大属性、事务的操作方式
数据库·mysql
csdn_aspnet3 小时前
macOS 10 、Docker 玩轉 MySQL
运维·mysql·macos·docker·容器·mac
flash俊杰4 小时前
v0.5-01 让桌面 AI 助手记得住:预算组装、递归摘要、长期记忆与评估基线
数据库·安全·架构
王中阳Go4 小时前
100 件货卖出 116 件,库存停在 -16
后端·mysql·go
2501_933923254 小时前
redis:string类型常见命令
数据库·redis·缓存
byte轻骑兵6 小时前
时序数据库选型指南:Apache IoTDB 社区版实践与踩坑
数据库·人工智能·apache·时序数据库·iotdb
黄连木笛6 小时前
Redis Insight 汉化教程:Windows / macOS / Linux 设置中文界面(附繁體、教程汉化、关闭自动更新)
数据库·redis·缓存
nice_lcj5207 小时前
MySQL 存储引擎入门:InnoDB 和 MyISAM 到底怎么选
java·数据库·mysql·面试·innodb·存储引擎·myisam