mysql触发器如何获取当前表名_Mysql如何获取中位数
前言:
在做监控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如何获取中位数相关推荐
- MySQL获取Schema表名和字段信息
MySQL获取Schema表名和字段信息 获取表名 select TABLE_NAME,TABLE_TYPE,ENGINE,TABLE_ROWS,TABLE_COMMENT,CREATE_TIME,U ...
- 【MySQL】如何使用SQL语句获取表结构和获取全部表名
目录 一.业务背景 二.如何获取全部表名 三.如何获取表结构 四.总结 一.业务背景 在实际的业务需求中,我们经常需要拿到数据库的全部表名,展示在后台中或者输出到文件里. 具体到业务中的需求比如: 导 ...
- Winform中实现连接Mysql并获取所有表名
场景 Winform中连接Mysql8并查询表中数据进行显示: Winform中连接Mysql8并查询表中数据进行显示_BADAO_LIUMANG_QIZHI的博客-CSDN博客 在上面实现连接Mys ...
- linux如何取文件列名,Linux_根据表名和索引获取需要的列名的存储过程,复制代码 代码如下: create proc p - phpStudy...
根据表名和索引获取需要的列名的存储过程 复制代码 代码如下: create proc p_sword_getblcolumn ( @tblName varchar(200), @fromIndex i ...
- ASP获取数据库表名,字段名以及对字段的一些操作
最近,在ASP论坛上看到很多网友问怎么获取数据库表名,字段名以及如何对字段进行删除,增添的操作故写此文. 本人对SQLServer比较熟一些,故以SQLServer为列: <% ...
- MySql 查询数据库中所有表名
MySql 查询数据库中所有表名 查询数据库中所有表名 select table_name from information_schema.tables where table_schema='csd ...
- MySQL使用SQL语句修改表名
MySQL中可以使用rename table这个SQL语句来修改表名. rename table这个SQL语句来修改表名的基本语法是: RENAME TABLE <旧表名> TO < ...
- mysql库表的触发器表名_MySQL 触发器,实现不同数据库,不同表名,表结构不同,数据实时同步...
创建触发器: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt ...
- mysql 分表规则获取表名_mysql分表和表分区详解
为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能 ...
最新文章
- ValueError: fill value must be in categories.
- 数据仓库项目管理面试题整理(十一)
- 安卓自动化测试(1)安卓自动化测试原理概念
- ThreadPoolExecutor线程池的理解与应用
- hash算法的介绍 【清晰易懂】
- [转]总结:Apache/Tomcat/JBOSS/Jetty/Nginx区别 .
- matlab矩阵 0,matlab zeros初始化为0矩阵
- 《深入理解分布式事务》第四章 分布式事务的基本概念和理论知识
- 警惕!不要让页面响应时间成为应用性能指标上的杠精
- java 中文 转义_java html中文汉字 反转义
- 量子计算机拓扑超导新状态,陈根:特殊超导体,有助于量子计算机运行
- 老李分享:Android性能优化之内存泄漏3
- 凸优化第五章对偶 5.6扰动及灵敏度分析
- plsql developer怎么使用 plsql developer使用教程
- Roboware主题配置教程
- Blumind 思维图软件
- 智能制造-从愿景到实现路径
- 山东科技大学计算机研究生学院官网,山东科技大学-计算机科学与工程学院
- bzoj5336: [TJOI2018]party【状压dp】
- 试用DreamWeaver CS6