查詢表中每個userid的loading_time 中位數
最終sql如下
set @id1 = 0;
set @id2 = 0;
select t2.userid,
sum(if(t3.id2=t2.id25, t3.loading_time, 0)) as t25,
sum(if(t3.id2=t2.id50, t3.loading_time, 0)) as t50,
sum(if(t3.id2=t2.id75, t3.loading_time, 0)) as t75
from (
select userid,
min(t.id1) + round((max(t.id1) - min(t.id1)) / 4, 0) as id25,
min(t.id1) + round((max(t.id1) - min(t.id1)) / 2, 0) as id50,
min(t.id1) + round(3 * (max(t.id1) - min(t.id1)) / 4, 0) as id75
from (
select @id1 := @id1 + 1 as id1, userid
from matchinfo
order by userid, loading_time
) as t
group by userid
) as t2
left join (
select @id2 := @id2 + 1 as id2, userid, loading_time
from matchinfo
order by userid, loading_time
) as t3 on t2.userid=t3.userid and (t2.id25 = t3.id2 or t2.id50 = t3.id2 or t2.id75 = t3.id2)
group by t2.userid;
查詢結果
具體思路是
先將資料排序,然後每行新增遞增序號id1
算出每組id1的中間值,這個中間值所在的行就對應了中位數
中位數的中位數
參照王曉東的演算法設計 中位數的中位數,即將一串數分成n段,求其排好序了的中間那個數,再把這些所有中位數再求一次中位數。for int i 0 i r p 4 5 i 找中位數的中位數,r p 4即上面所說的n 5 int x lineselect a,p,p r p 4 5,r p 4 10 線性...
mysql 位數 MySQL中位數計算方法
在網上搜到的一種演算法是利用自增長變數進行排序,然後再根據位置序號取。感覺有些複雜了,還是group concat來的省事些 1.按順序聚合,逗號分隔,並計數 group concat number order by number asc 2.根據逗號拆分,判斷奇偶數去擷取中間位置的那個數 具體 如...
mysql計算位數 MySQL中位數計算方法
在網上搜到的一種演算法是利用自增長變數進行排序,然後再根據位置序號取。感覺有些複雜了,還是group concat來的省事些 1.按順序聚合,逗號分隔,並計數 group concat number order by number asc 2.根據逗號拆分,判斷奇偶數去擷取中間位置的那個數 具體 如...