前言:


在做监控ETL任务的dashboard的时候,有这样一个需求——记录近三天调度耗时与历史执行中位数耗时比值TOP20。起初,感觉很简单,但在实际的开发过程中,sql底子弱的问题被暴露的一览无余,来来回回居然折腾了一天。哎,太菜,记录一下心路历程。

单一中位数的求取


  • 中位数是啥

一串数字,按从小到大排列,当总数是奇数时,取最中间的数;当总数是偶数时,取最中间两个数的平均数。
  • 单一中位数的参考

    何为单一呢?就是你只要从一组数据中,找出一个即可,假如是这样的需求,你可以参考以下两种写法:

参考一:select group_concat(id), avg(value) from ( #最外层开始  select id, value from ( #第二层开始    select id, @index:=@index+1 as myindex, value from student, (select @index:=0) AS initvar order by value #最内层  ) as t where floor(@index/2+1)=myindex or ceil(@index/2)=myindex #第二层结束) as x  #最外层结束参考二:SELECT AVG (DISTINCT income)FROM (SELECT t1.income FROM Graduates t1,Graduates t2                GROUP BY t1.income                --s1 的条件                HAVING SUM(CASE WHEN t2.income >= t1.income THEN 1 ELSE 0 END)                            >= COUNT(*) / 2.0                --s2的条件                AND SUM(CASE WHEN t2.income <= t1.income THEN 1 ELSE 0 END)                            >= COUNT(*) / 2.0) TMP;

分组中位数的求取


但往往在实际开发过程中,不会那么简单,涉及的数据量会特别庞大,需要你求的也是一堆数据中的去取一堆中位数,怎么做呢?提供一种解题思路:

  • 第一步:对数据进行分组排序,并给每一组的数据进行分组编号

    (由于我的mysql版本5.7不支持 row_number函数,所以,需要自行row_number函数功能的实现,干货如下:)

select      @row_number:=CASE WHEN @customer_no = x.project_id THEN @row_number +1 ELSE 1 END AS num1,      @customer_no:=x.project_id AS project_id,      //customer_no是一个临时变量,每次查询都被赋值为x.project_id。而case中判断条件在customer_no赋值之前,其实就是判断当前行x.project_id值是否与上一行x.project_id值相同。当不相同时重新编号(输出1),从而实现了分组顺序编号的功能      x.overtime          from(        select          (ef.end_time - ef.start_time) as overtime,          ef.project_id,          st.task_name,          st.task_desc,        st.create_user        from          azkaban.execution_flows ef          LEFT JOIN azkaban.projects pj ON ef.project_id = pj.id        Where          ef.start_time > UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 10 day)) * 1000          AND ef.STATUS != '70'        order by          ef.project_id      ) x,(        SELECT          @row_number:=0,          @customer_no:=0      ) as it    order by      x.project_id,x.overtime; 
  • 第二步:获取各分组的中位数编号

    由于我的数据量很大,所以,我这边就直接进行(count(*) DIV 2 +1)作为我的分组中位数的编号。

select  (count(*) DIV 2 +1) as num,  ef.project_id  from azkaban.execution_flows ef  where  ef.start_time > UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 10 day)) * 1000  AND ef.STATUS != '70'  group by ef.project_id)xxxx on xxx.project_id= xxxx.project_id
  • 第三步:进行left join 即可

  select xxx.overtime as avgOverTime,      xxx.task_name as taskName      from( 第一步 )xxx      left join( 第二步 )xxxx on xxx.project_id= xxxx.project_id  where  xxx.num1=xxxx.num

总结:


sql功力还是欠佳,加油,菜鸡共勉!

mysql触发器如何获取当前表名_Mysql如何获取中位数相关推荐

  1. MySQL获取Schema表名和字段信息

    MySQL获取Schema表名和字段信息 获取表名 select TABLE_NAME,TABLE_TYPE,ENGINE,TABLE_ROWS,TABLE_COMMENT,CREATE_TIME,U ...

  2. 【MySQL】如何使用SQL语句获取表结构和获取全部表名

    目录 一.业务背景 二.如何获取全部表名 三.如何获取表结构 四.总结 一.业务背景 在实际的业务需求中,我们经常需要拿到数据库的全部表名,展示在后台中或者输出到文件里. 具体到业务中的需求比如: 导 ...

  3. Winform中实现连接Mysql并获取所有表名

    场景 Winform中连接Mysql8并查询表中数据进行显示: Winform中连接Mysql8并查询表中数据进行显示_BADAO_LIUMANG_QIZHI的博客-CSDN博客 在上面实现连接Mys ...

  4. linux如何取文件列名,Linux_根据表名和索引获取需要的列名的存储过程,复制代码 代码如下: create proc p - phpStudy...

    根据表名和索引获取需要的列名的存储过程 复制代码 代码如下: create proc p_sword_getblcolumn ( @tblName varchar(200), @fromIndex i ...

  5. ASP获取数据库表名,字段名以及对字段的一些操作

    最近,在ASP论坛上看到很多网友问怎么获取数据库表名,字段名以及如何对字段进行删除,增添的操作故写此文. 本人对SQLServer比较熟一些,故以SQLServer为列:    <%       ...

  6. MySql 查询数据库中所有表名

    MySql 查询数据库中所有表名 查询数据库中所有表名 select table_name from information_schema.tables where table_schema='csd ...

  7. MySQL使用SQL语句修改表名

    MySQL中可以使用rename table这个SQL语句来修改表名. rename table这个SQL语句来修改表名的基本语法是: RENAME TABLE <旧表名> TO < ...

  8. mysql库表的触发器表名_MySQL 触发器,实现不同数据库,不同表名,表结构不同,数据实时同步...

    创建触发器: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt ...

  9. mysql 分表规则获取表名_mysql分表和表分区详解

    为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能 ...

最新文章

  1. ValueError: fill value must be in categories.
  2. 数据仓库项目管理面试题整理(十一)
  3. 安卓自动化测试(1)安卓自动化测试原理概念
  4. ThreadPoolExecutor线程池的理解与应用
  5. hash算法的介绍 【清晰易懂】
  6. [转]总结:Apache/Tomcat/JBOSS/Jetty/Nginx区别 .
  7. matlab矩阵 0,matlab zeros初始化为0矩阵
  8. 《深入理解分布式事务》第四章 分布式事务的基本概念和理论知识
  9. 警惕!不要让页面响应时间成为应用性能指标上的杠精
  10. java 中文 转义_java html中文汉字 反转义
  11. 量子计算机拓扑超导新状态,陈根:特殊超导体,有助于量子计算机运行
  12. 老李分享:Android性能优化之内存泄漏3
  13. 凸优化第五章对偶 5.6扰动及灵敏度分析
  14. plsql developer怎么使用 plsql developer使用教程
  15. Roboware主题配置教程
  16. Blumind 思维图软件
  17. 智能制造-从愿景到实现路径
  18. 山东科技大学计算机研究生学院官网,山东科技大学-计算机科学与工程学院
  19. bzoj5336: [TJOI2018]party【状压dp】
  20. 试用DreamWeaver CS6

热门文章

  1. Spring 实践 -AOP
  2. 第六届蓝桥杯【省赛试题 7】牌型种数 - i 逆天耗子 - CSDN 博客
  3. 微信小游戏的前端攻城狮玩法
  4. Swift字符串转换成类
  5. linux 文件大小总和,linux磁盘占用跟每个文件夹大小总和不符?
  6. php 加日志,添加日志的相关内容推荐
  7. ZZULIOJ 1132: 数字字符统计
  8. ZZULIOJ 1060:逆序数字
  9. mysql删除unionkey_MySQL索引如何优化?二十条铁则送给你
  10. godot python_我的godot开发环境调教记录分享