今天收到同事的一需求,要求实现以下功能:

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分析函数的实现相关推荐

  1. mysql 分析函数_MySQL分析函数实现

    | MySQL分析函数实现 还好MySQL8.0已经实现了与Oracle相同的分析函数. 1. 实现rownum SET @rn:=0; SELECT @rn:=@rn+1 AS rownum ,e. ...

  2. MySQL性能优化、故障排查及最佳实践秘籍,阿里云数据库专家玄惭的“武功”全记录...

    为什么80%的码农都做不了架构师?>>>    文章简介 玄惭,真名罗龙九,阿里云DBA专家,负责阿里云RDS线上稳定以及专家服务团队.他经历过阿里历年双11实战考验,积累了7年对阿 ...

  3. oracle 判断是否错误_Oracle中的并行系列(二):你设置的并行真的生效了吗?...

    作者  刘金龙·沃趣科技高级数据库技术专家 出品  沃趣科技 经过第一篇文章<Oracle 中的并行系列(一)>的介绍,我们对Oracle中的并行有了大致的了解.但是实际使用并行的过程中我 ...

  4. 玄惭 mysql_阿里云数据库专家玄惭的“武功”全记录之最佳实践、双十一特别篇...

    原标题:阿里云数据库专家玄惭的"武功"全记录之最佳实践.双十一特别篇 专题简介 玄惭,真名罗龙九,阿里云DBA专家,负责阿里云RDS线上稳定以及专家服务团队.他经历过阿里历年双11 ...

  5. oracle sql时间排序函数,sql的rank函数

    SQL SERVER 2008排序函数(窗口函数) 排序函数可以用来协助给结果集增加位置信息.SQL SERVER 2008只有四个排序函数,介绍如下: ROW_NUMBER:返回结果集中给定行的序号 ...

  6. Oracle 分析函数 over 和MySQL 实现类似效果写法

    (1)分析函数: rank ( ) over ( [query_partition_clause]order_by_clause ) dense_rank ( ) over([query_partit ...

  7. hive mysql 实战_【Hive】HiveQL实战之分析函数窗口函数

    本篇主要介绍将存储到Mysql的示例数据库Sakila以Sqoop的方式导入到Hive,然后详细讲解Hive的分析函数和窗口函数. 一 实战环境 1 Hive版本 hive> select ve ...

  8. mysql开窗函数over_oracle分析函数技术详解(配上开窗函数over())

    一.Oracle分析函数入门 分析函数是什么? 分析函数是Oracle专门用于 解决复杂报表统计需求 的功能强大的函数, 它可以在数据中进行分组然后计算基于组的某种统计 ,并且每一组的每一行都可以返回 ...

  9. MySQL 空间分析函数

    名称 描述 GeomCollection() 从几何图形构造几何图形集合 GeometryCollection() 从几何图形构造几何图形集合 LineString() 从点值构造线字符串 MBRCo ...

最新文章

  1. 【实用快捷键】设置WebStorm中Show in Explorer(在资源管理器中打开)快捷键Alt+Shift+R(类似VSCode)
  2. Spring原理简述
  3. Linxu用户登录监测
  4. [Selenium] 基本使用
  5. Ansible中文权威指南
  6. httpClient实现微信公众号消息群发
  7. 爬虫实战学习笔记_4 网络请求urllib3模块:发送GET/POST请求实例+上传文件+IP代理+json+二进制+超时
  8. soa面向服务体系结构_服务和面向微服务的体系结构简介
  9. 高速收费员招聘考试题计算机题,高速公路面试题和考官题本及答案44套
  10. noi2017滚粗记
  11. OTN告警测试1:LOS
  12. 全选、删除、撤回、剪切、复制、粘贴、永久性删除、新建文件夹、启动任务管理器、退出的快捷键
  13. 摄像头 - 对焦算法实现总结
  14. vlookup使用步骤_vlookup怎么用详细步骤(vlookup函数的使用方法)
  15. Leetcode:Singel Number
  16. sessionStorage存储数据和取数据
  17. SAP中通过控制工序中的与成本核算相关来控制成本核算时工时取值
  18. ip5108 c语言程序,IP5109,IP5108,IP5206,IP5105 移动电源5合一芯片介绍.pdf
  19. 微信小程序渲染实时时间
  20. java斗地主发牌_[Java源码]扑克牌——斗地主发牌实现

热门文章

  1. echarts中tooltip提示框位置控制
  2. OSS内文件如何设置为无时间限制的下载链接
  3. 特斯拉要用太阳能满足整座岛全年能源需求
  4. 【Android】实验3 颜色、字符串资源的使用【提交截止时间:2016.4.1】
  5. 黄聪:mysql 存在该记录则更新,不存在则插入记录的sql
  6. [转]gcc下程序调用静态库编译命令:主文件必须在静态库前面!
  7. MOSS关于Workflow
  8. Re:[转]Microsoft .Net Remoting系列专题
  9. Ruby游戏开发-BMXP介绍
  10. 拿着6位数工资,没写一行代码!为何还能成为最佳员工?