MySQL GROUP BY独特排序:去重排名获取最值
176 浏览量
更新于2023-05-03
收藏 35KB PDF 举报
在MySQL中,`GROUP BY` 是一个强大的工具,特别适用于处理数据去重和排序的需求。当需要对数据进行分组并找出每个组内的特定值(如最大值、最小值或特定条件下的第一行)时,`GROUP BY` 功能显得尤为关键。这里介绍了一种利用 `GROUP BY` 实现独特排序的方法。
首先,理解`GROUP BY` 的基本原理:在SQL查询中,当你对数据进行分组时,`GROUP BY` 子句会将具有相同值的行组合在一起。在MySQL中,如果查询结果中的选择字段没有明确使用聚合函数(如COUNT, SUM, AVG等),则MySQL会返回每个组的第一行,这与Oracle等其他数据库的行为不同。
例如,假设有一个需求是对用户的成绩、活动时间、开始时间等字段进行去重,并找到每个用户的成绩最高、时间最短以及参与活动最早的记录。可以通过以下步骤实现:
1. 首先,从数据库中选择需要的字段,包括用户ID (`id`), 成绩 (`score`), 时间差 (`end_time - start_time`), 开始时间 (`start_time`), 用户名 (`real_name`), 电话 (`tel`), 和过期代码 (`expiry_code`)。
2. 使用子查询来获取满足条件的数据,筛选出成绩大于0且电话不为空的记录。同时,对这些字段进行降序排序,先按成绩(`score`)降序,再按时间差(`end_time - start_time`)升序,最后按开始时间(`start_time`)升序。
3. 在这个子查询的基础上,对电话 (`tel`) 进行 `GROUP BY`,因为每个用户的记录将会被归到同一组。然后对每个组再次进行排序,但这次是根据原始的排序规则(成绩、时间差和开始时间)。
4. 为了得到每个组的第一行,引入变量 `@rowno`,这是一个变量自增计数器,通过 `SET @rowno := @rowno + 1` 来跟踪每一组的行号。这样,`rank` 列会显示每个用户记录的排名。
5. 添加一个额外的限制条件,例如只取时间差大于5分钟的记录,使用 `WHERE (C.end_time - C.start_time) > 5`。
6. 最后,使用 `LIMIT 0, 50` 获取前50个符合条件的结果。
总结起来,这个方法巧妙地利用了MySQL的特性,结合 `GROUP BY` 和自定义变量,实现了对复杂排序需求的高效处理。需要注意的是,在处理MySQL 5.7及以上版本的分组查询时,确保所有不在 `GROUP BY` 子句中的列都已应用聚合函数,否则可能会出现错误。
2020-04-18 上传
2020-12-14 上传
2023-02-22 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
2023-09-12 上传
weixin_38682254
- 粉丝: 7
- 资源: 938
最新资源
- 多传感器数据融合手册:国外原版技术指南
- MyEclipse快捷键大全,提升编程效率
- 从零开始的编程学习:Linux汇编语言入门
- EJB3.0实例教程:从入门到精通
- 深入理解jQuery源码:解析与分析
- MMC-1电机控制ASSP芯片用户手册
- HS1101相对湿度传感器技术规格与应用
- Shell基础入门:权限管理与常用命令详解
- 2003年全国大学生电子设计竞赛:电压控制LC振荡器与宽带放大器
- Android手机用户代理(User Agent)详解与示例
- Java代码规范:提升软件质量和团队协作的关键
- 浙江电信移动业务接入与ISAG接口实战指南
- 电子密码锁设计:安全便捷的新型锁具
- NavTech SDAL格式规范1.7版:车辆导航数据标准
- Surfer8中文入门手册:绘制等高线与克服语言障碍
- 排序算法全解析:冒泡、选择、插入、Shell、快速排序