mysql中如何查询前90%的数据值
发布时间:2022-01-12 10:51:07 所属栏目:MySql教程 来源:互联网
导读:这篇文章主要为大家展示了mysql中如何查询前90%的数据值,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下mysql中如何查询前90%的数据值这篇文章吧。 先创建实验数据 create table t( query_time date, ts float )
这篇文章主要为大家展示了“mysql中如何查询前90%的数据值”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql中如何查询前90%的数据值”这篇文章吧。 先创建实验数据 create table t( query_time date, ts float ); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-29',90.04); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-29',89.24); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-29',76.08); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-29',12.66); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-29',35.08); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-29',37.42); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-29',81.86); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-29',97.03); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-29',39.57); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-29',6.75); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-29',15.05); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-29',55); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-29',29.83); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-29',84.17); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-29',31.35); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-29',4.24); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-29',27.17); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-29',23.14); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-29',34.16); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-29',1.38); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-30',4.42); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-30',17.97); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-30',76.6); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-30',29.08); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-30',15.58); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-30',90.68); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-30',6.67); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-30',61.28); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-30',86.42); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-30',48.24); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-30',81.94); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-30',64.99); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-30',79.13); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-30',0.66); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-30',65.93); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-30',27.65); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-30',40.46); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-30',19.36); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-30',75.4); INSERT INTO `t` (`query_time`,`ts`) VALUES ('2018-06-30',18.94); t是查询日志表. 表有两列数据,其中一列是查询时间,另外一列是 查询的时间. 查询每天 前71%,81%,91%的记录的时间. 其中的百分比是动态修改的,配置信息存放在表里.使用如下SQL模拟. 其中v是百分比,seq是排序显示的优先级. 求解SQL如下: select query_time,v,ts from ( select t6.query_time,t6.ts,v,seq, case when @gid=concat(seq,'#',query_time) then @rn:=@rn+1 when @gid:=concat(seq,'#',query_time) then @rn:=1 end s from ( select query_time,ts,rn,percent,v,v-percent d,seq from ( select t2.query_time,ts,rn,rn/total percent from ( select query_time,ts, case when @gid=query_time then @rn:=@rn+1 when @gid:=query_time then @rn:=1 end rn from ( select * from t ,(select @gid:='',@rn:=0) vars order by query_time,ts ) t1 ) t2 inner join ( select query_time,count(*) total from t group by query_time ) t3 on(t2.query_time=t3.query_time) ) t4 , (select 0.71 v,1 seq union all select 0.81,2 union all select 0.91,3) t5 ) t6 where d>=0 order by query_time,v,d ) t7 where s=1 order by query_time,seq ; 核心思路: 1.按照日期分组,以查询时间排序,在分组内加行号. 2.分组内行号除以每天查询的总数,可以得出本记录在全体中的百分比 3.用配置表中配置的百分比减去第二步算出的百分比,大于0的最小记录就是我们要的结果. 这个计算过程再次使用了分组内排序加行号的操作. 性能分析 在MySQL数据库下,这应该是这种需求性能最好的解法了. 对于符合条件的记录进行了两遍扫描. 以上是“mysql中如何查询前90%的数据值”这篇文章的所有内容,感谢各位的阅读! (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |