加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.zhandada.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

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%的数据值”这篇文章的所有内容,感谢各位的阅读!

(编辑:站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读