mysql分析函数的实现
今天收到同事的一需求,要求实现以下功能:
drop table test;
create table test(name varchar(10),name1 varchar(10),count bigint);
delete from test;
insert into test values(‘1′,’a’,2);
insert into test values(‘1′,’b’,1);;
insert into test values(‘1′,’c’,4);
insert into test values(‘1′,’d’,5);
insert into test values(‘1′,’e’,7);
insert into test values(‘1′,’f’,8);
insert into test values(‘2′,’g’,9);
insert into test values(‘2′,’h’,0);
insert into test values(‘2′,’i’,21);
insert into test values(‘2′,’j’,3);
insert into test values(‘2′,’k’,4);
insert into test values(‘2′,’l’,56);
insert into test values(‘3′,’m’,67);
insert into test values(‘3′,’n’,89);
insert into test values(‘3′,’o’,12);
insert into test values(‘3′,’p’,22);
insert into test values(‘3′,’q’,23);
insert into test values(‘3′,’r’,42);
insert into test values(‘3′,’s’,26);
根据name字段分组,取出改组内的前4项,并且按照count字段进行降序排序,由于mysql没有oracle中的分析函数,看上去很简单的需求,但是折腾了许久,还是没有实现,于是乎在网上收罗了一下mysql分析函数是怎么实现的 ,找到了mysql分析函数的解决办法,学习了一下,于是乎把同事的功能实现了;
select name, name1, count from (select b.name, b.name1, b.count,
if(@name = b.name, @rank := @rank + 1, @rank := 1) as rank,@name:=b.name
from (select name, name1, count from test order by name asc, count desc) b,
(select @rownum := 0, @name := null, @rank := 0) a) result where rank<5;
| name | name1 | count |+——+——-+——-+| 1 | f | 8 || 1 | e | 7 || 1 | d | 5 || 1 | c | 4 || 2 | l | 56 || 2 | i | 21 || 2 | g | 9 || 2 | k | 4 || 3 | n | 89 || 3 | m | 67 || 3 | r | 42 || 3 | s | 26 |+——+——-+——-+12 rows in set (0.02 sec)
如果上面的sql初次看到有些让人摸不着头脑的话,你可以看看他的执行计划,然后从执行计划得到一些执行流程,该sql中最核心的技术点为使用自定义变量来保存sql执行过程中的值:
if(@name = b.name, @rank := @rank + 1, @rank := 1) as rank,@name:=b.name
这条判断语句对下面结果进行处理,并生成rank,由于下面查询的结果中对name做了排序,所以@name:=b.name使的相同name值的rank能够递增;
+—-+————-+————+——–+—————+——+———+——+——+—————-+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+—-+————-+————+——–+—————+——+———+——+——+—————-+| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 19 | Using where || 2 | DERIVED | <derived4> | system | NULL | NULL | NULL | NULL | 1 | || 2 | DERIVED | <derived3> | ALL | NULL | NULL | NULL | NULL | 19 | || 4 | DERIVED | NULL | NULL | NULL | NULL | NULL | NULL | NULL | No tables used || 3 | DERIVED | test | ALL | NULL | NULL | NULL | NULL | 19 | Using filesort |
如果你对下面的select @rownum := 0, @name := null, @rank := 0看不太明白,可以改写一下sql:
select name, name1, count from (select b.name, b.name1,b.count,
if(@name = b.name, @rank := @rank + 1, @rank := 1) as rank,@name:=b.name
from (select name, name1, count,@rownum := 0, @name := null, @rank := 0
from test order by name asc, count desc) b) result where rank<4;
+—-+————-+————+——+—————+——+———+——+——+—————-+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+—-+————-+————+——+—————+——+———+——+——+—————-+| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 19 | Using where || 2 | DERIVED | <derived3> | ALL | NULL | NULL | NULL | NULL | 19 | || 3 | DERIVED | test | ALL | NULL | NULL | NULL | NULL | 19 | Using filesort |+—-+————-+————+——+—————+——+———+——+——+—————-+
mysql分析函数的实现相关推荐
- mysql 分析函数_MySQL分析函数实现
| MySQL分析函数实现 还好MySQL8.0已经实现了与Oracle相同的分析函数. 1. 实现rownum SET @rn:=0; SELECT @rn:=@rn+1 AS rownum ,e. ...
- MySQL性能优化、故障排查及最佳实践秘籍,阿里云数据库专家玄惭的“武功”全记录...
为什么80%的码农都做不了架构师?>>> 文章简介 玄惭,真名罗龙九,阿里云DBA专家,负责阿里云RDS线上稳定以及专家服务团队.他经历过阿里历年双11实战考验,积累了7年对阿 ...
- oracle 判断是否错误_Oracle中的并行系列(二):你设置的并行真的生效了吗?...
作者 刘金龙·沃趣科技高级数据库技术专家 出品 沃趣科技 经过第一篇文章<Oracle 中的并行系列(一)>的介绍,我们对Oracle中的并行有了大致的了解.但是实际使用并行的过程中我 ...
- 玄惭 mysql_阿里云数据库专家玄惭的“武功”全记录之最佳实践、双十一特别篇...
原标题:阿里云数据库专家玄惭的"武功"全记录之最佳实践.双十一特别篇 专题简介 玄惭,真名罗龙九,阿里云DBA专家,负责阿里云RDS线上稳定以及专家服务团队.他经历过阿里历年双11 ...
- oracle sql时间排序函数,sql的rank函数
SQL SERVER 2008排序函数(窗口函数) 排序函数可以用来协助给结果集增加位置信息.SQL SERVER 2008只有四个排序函数,介绍如下: ROW_NUMBER:返回结果集中给定行的序号 ...
- Oracle 分析函数 over 和MySQL 实现类似效果写法
(1)分析函数: rank ( ) over ( [query_partition_clause]order_by_clause ) dense_rank ( ) over([query_partit ...
- hive mysql 实战_【Hive】HiveQL实战之分析函数窗口函数
本篇主要介绍将存储到Mysql的示例数据库Sakila以Sqoop的方式导入到Hive,然后详细讲解Hive的分析函数和窗口函数. 一 实战环境 1 Hive版本 hive> select ve ...
- mysql开窗函数over_oracle分析函数技术详解(配上开窗函数over())
一.Oracle分析函数入门 分析函数是什么? 分析函数是Oracle专门用于 解决复杂报表统计需求 的功能强大的函数, 它可以在数据中进行分组然后计算基于组的某种统计 ,并且每一组的每一行都可以返回 ...
- MySQL 空间分析函数
名称 描述 GeomCollection() 从几何图形构造几何图形集合 GeometryCollection() 从几何图形构造几何图形集合 LineString() 从点值构造线字符串 MBRCo ...
最新文章
- 【实用快捷键】设置WebStorm中Show in Explorer(在资源管理器中打开)快捷键Alt+Shift+R(类似VSCode)
- Spring原理简述
- Linxu用户登录监测
- [Selenium] 基本使用
- Ansible中文权威指南
- httpClient实现微信公众号消息群发
- 爬虫实战学习笔记_4 网络请求urllib3模块:发送GET/POST请求实例+上传文件+IP代理+json+二进制+超时
- soa面向服务体系结构_服务和面向微服务的体系结构简介
- 高速收费员招聘考试题计算机题,高速公路面试题和考官题本及答案44套
- noi2017滚粗记
- OTN告警测试1:LOS
- 全选、删除、撤回、剪切、复制、粘贴、永久性删除、新建文件夹、启动任务管理器、退出的快捷键
- 摄像头 - 对焦算法实现总结
- vlookup使用步骤_vlookup怎么用详细步骤(vlookup函数的使用方法)
- Leetcode:Singel Number
- sessionStorage存储数据和取数据
- SAP中通过控制工序中的与成本核算相关来控制成本核算时工时取值
- ip5108 c语言程序,IP5109,IP5108,IP5206,IP5105 移动电源5合一芯片介绍.pdf
- 微信小程序渲染实时时间
- java斗地主发牌_[Java源码]扑克牌——斗地主发牌实现
热门文章
- echarts中tooltip提示框位置控制
- OSS内文件如何设置为无时间限制的下载链接
- 特斯拉要用太阳能满足整座岛全年能源需求
- 【Android】实验3 颜色、字符串资源的使用【提交截止时间:2016.4.1】
- 黄聪:mysql 存在该记录则更新,不存在则插入记录的sql
- [转]gcc下程序调用静态库编译命令:主文件必须在静态库前面!
- MOSS关于Workflow
- Re:[转]Microsoft .Net Remoting系列专题
- Ruby游戏开发-BMXP介绍
- 拿着6位数工资,没写一行代码!为何还能成为最佳员工?