91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL如何實現百分位數計算

發布時間:2021-11-01 15:31:21 來源:億速云 閱讀:906 作者:小新 欄目:MySQL數據庫

這篇文章主要介紹了MySQL如何實現百分位數計算,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。



創建試驗數據,5天每天一百萬隨機數據,總共500w數據

create table nums(id int not null primary key);
delimiter $$
begin
    truncate table nums;
    while s*2<=cnt do
        set s=s*2;
end $$

call pFastCreateNums(2000000);

drop table if exists t ;
create table t(
    query_time date,
    ts float,
    key(query_time,ts)
);


insert into t select '2018-07-01',round(100000*rand(),2) from nums where id<=1000000;
insert into t select '2018-07-02',round(100000*rand(),2) from nums where id<=1000000;
insert into t select '2018-07-03',round(100000*rand(),2) from nums where id<=1000000;
insert into t select '2018-07-04',round(100000*rand(),2) from nums where id<=1000000;
insert into t select '2018-07-05',round(100000*rand(),2) from nums where id<=1000000;

首先,修正上文的SQL,增加精度,因為在大數據量下,會有顯著的誤差。


  1. select query_time,v,ts

  2. from (

  3.     select t6.query_time,t6.ts,v,seq,

  4.     case when @gid=concat(seq,'#',query_time) then @rn:=@rn+1 when @gid:=concat(seq,'#',query_time) then @rn:=1 end s

  5.     from (

  6.         select query_time,ts,rn,percent,v,v-percent d,seq from (

  7.             select t2.query_time,ts,rn,round(rn/total,10) percent from (

  8.                 select query_time,ts,

  9.                 case when @gid=query_time then @rn:=@rn+1 when @gid:=query_time then @rn:=1 end rn

  10.                 from (

  11.                     select * from t ,(select @gid:='',@rn:=0) vars order by query_time,ts

  12.                 ) t1

  13.             ) t2 inner join (

  14.                 select query_time,count(*) total from t group by query_time

  15.             ) t3 on(t2.query_time=t3.query_time)

  16.         ) t4 ,

  17.         (select 0.71 v,1 seq union all select 0.81,2 union all select 0.91,3) t5

  18.     ) t6 where d>=0 order by query_time,v,d

  19. ) t7 where s=1 order by query_time,seq ;


在ssd環境下,上文的SQL運行時長和結果如下.
MySQL如何實現百分位數計算
148.813 s 


前文這個SQL的計算結果是非常精確的
但是計算時間和 采樣點數量 有巨大關系. 假如原始數據是100w,三個百分位數的采樣,則數據擴張到300w;4個百分位數的采樣,則數據擴張到400w.這是因為使用笛卡爾積擴張了數據的緣故.

優化版本:

  1. select query_time,d,max(ts) ts from (

  2.     select t2.query_time,ts,rn,round(rn/total,10) percent,

  3.     case

  4.     when 0.71>=round(rn/total,10) then 0.71

  5.     when 0.81>=round(rn/total,10) then 0.81

  6.     when 0.91>=round(rn/total,10) then 0.91

  7.     end d

  8.     from (

  9.         select query_time,ts,

  10.         case when @gid=query_time then @rn:=@rn+1 when @gid:=query_time then @rn:=1 end rn

  11.         from (

  12.             select * from t ,(select @gid:='',@rn:=0) vars order by query_time,ts

  13.         ) t1

  14.     ) t2 inner join (

  15.         select query_time,count(*) total from t group by query_time

  16.     ) t3 on(t2.query_time=t3.query_time)

  17. ) t6

  18. where d is not null

  19. group by query_time,d


結果:
MySQL如何實現百分位數計算
用時:
33.922 秒

感謝你能夠認真閱讀完這篇文章,希望小編分享的“MySQL如何實現百分位數計算”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

苏尼特左旗| 黑龙江省| 绿春县| 潞城市| 锡林郭勒盟| 内丘县| 来凤县| 安福县| 石柱| 鞍山市| 深泽县| 鄂州市| 常州市| 雷州市| 洛浦县| 房产| 集安市| 文昌市| 道真| 时尚| 定边县| 永宁县| 内江市| 龙山县| 安丘市| 临西县| 晋城| 基隆市| 黔西县| 垦利县| 灯塔市| 苍溪县| 永城市| 台南县| 峡江县| 乌鲁木齐县| 博白县| 高清| 武夷山市| 收藏| 抚宁县|