您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“MySQL百分位數(shù)如何計算”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學習一下“MySQL百分位數(shù)如何計算”這篇文章吧。
select query_time,d,max(ts) ts from (
select t2.query_time,ts,rn,round(rn/total,10) percent,
case
when 0.71>=round(rn/total,10) then 0.71
when 0.81>=round(rn/total,10) then 0.81
when 0.91>=round(rn/total,10) then 0.91
end d
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)
where round(rn/total,10)>=0.71
) t6
where d is not null
group by query_time,d
where round(rn/total,10)>=0.71
即 用定義的最小的百分位數(shù)進行過濾后,再group by
此時 查詢時間可以低至 20.531 s
當然,這個SQL還有進一步提升的空間
計算 某個百分位數(shù)的位置,有如下的公式:
loc=1+(n-1)*p,n是元素數(shù),p是分位點。loc大小介于1和n之間
那么SQL可以進行如下優(yōu)化
select t5.query_time,t5.ts,t2.v from (
select query_time,total,v, floor(1+(total-1)*v) rn
from (
select query_time,count(*) total from t group by query_time
) t3, (select 0.71 v,1 seq union all select 0.81,2 union all select 0.91,3) t4
)
t2 inner join (
select
query_time,
case when @gid=query_time then @rn:=@rn+1 when @gid:=query_time then @rn:=1 end rn,
ts
from (
select * from t ,(select @gid:='',@rn:=0) vars order by query_time,ts
) t1
) t5 on (t2.query_time=t5.query_time and t2.rn=t5.rn )
除了本身簡化了SQL復雜度,查詢時間也低至 15秒左右
以上是“MySQL百分位數(shù)如何計算”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。