mysql中如何查询前90%的数据值


这篇文章主要为大家展示了“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 unio开发云主机域名n 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%的数据值”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注开发云行业资讯频道!

相关推荐: MySQL自动备份的脚本及异地定时FTP

这篇文章主要介绍“MySQL自动备份的脚本及异地定时FTP”,在日常操作中,相信很多人在MySQL自动备份的脚本及异地定时FTP问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL自动备份的脚本及异地定时FTP”的疑惑有所帮…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 06/22 17:36
下一篇 06/22 17:36

相关推荐