[tbl_votes]
- id <!-- unique id of the vote) -->
- item_id <!-- vote belongs to item <id> -->
- vote <!-- number 1-10 -->
当然,我们可以通过获取:
来解决这个问题smallest observation
(so)lower quartile
(lq)median
(我)upper quartile
(uq)largest observation
(lo)..使用多个查询一个接一个,但我想知道是否可以使用单个查询完成。
在Oracle中,我可以使用COUNT OVER
和RATIO_TO_REPORT
,但mySQL不支持此功能。
对于那些不知道盒子图是什么的人:http://en.wikipedia.org/wiki/Box_plot
任何帮助将不胜感激。
答案 0 :(得分:2)
我使用PL / Python在PostgreSQL中找到了一个解决方案。
但是,我保留问题,以防其他人在mySQL中提出解决方案。
CREATE TYPE boxplot_values AS (
min numeric,
q1 numeric,
median numeric,
q3 numeric,
max numeric
);
CREATE OR REPLACE FUNCTION _final_boxplot(strarr numeric[])
RETURNS boxplot_values AS
$$
x = strarr.replace("{","[").replace("}","]")
a = eval(str(x))
a.sort()
i = len(a)
return ( a[0], a[i/4], a[i/2], a[i*3/4], a[-1] )
$$
LANGUAGE 'plpythonu' IMMUTABLE;
CREATE AGGREGATE boxplot(numeric) (
SFUNC=array_append,
STYPE=numeric[],
FINALFUNC=_final_boxplot,
INITCOND='{}'
);
示例:强>
SELECT customer_id as cid, (boxplot(price)).*
FROM orders
GROUP BY customer_id;
cid | min | q1 | median | q3 | max
-------+---------+---------+---------+---------+---------
1001 | 7.40209 | 7.80031 | 7.9551 | 7.99059 | 7.99903
1002 | 3.44229 | 4.38172 | 4.72498 | 5.25214 | 5.98736
来源:http://www.christian-rossow.de/articles/PostgreSQL_boxplot_median_quartiles_aggregate_function.php
答案 1 :(得分:0)
我可以在两个查询中完成。 执行第一个查询以获取四分位数的位置,然后使用限制函数 在第二个查询中得到答案。
的MySQL&GT; select(select floor(count(*)/ 4))as first_q,(select floor(count(*)/ 2)from customer_data)作为mid_pos,(从customer_data选择楼层(count(*)/ 4 * 3)作为third_q来自 customer_data按度量限制1的顺序;
的MySQL&GT; select min(measure),(从customer_data order by measure limit 0,1中选择度量)作为firstq(从customer_data order by measure limit 5,1中选择度量)作为中位数,(按customer_data顺序从度量限制8,1中选择度量) )作为来自customer_data的last_q,max(measure);
答案 2 :(得分:0)
以下是计算e256
组中e32
值范围的四分位数的示例,在这种情况下,(e32,e256)的索引是必须的:
SELECT
@group:=IF(e32=@group, e32, GREATEST(@index:=-1, e32)) as e32_,
MIN(e256) as so,
MAX(IF(lq_i=(@index:=@index+1), e256, NULL)) as lq,
MAX(IF(me_i=@index, e256, NULL)) as me,
MAX(IF(uq_i=@index, e256, NULL)) as uq,
MAX(e256) as lo
FROM (SELECT @index:=NULL, @group:=NULL) as init, test t
JOIN (
SELECT e32,
COUNT(*) as cnt,
(COUNT(*) div 4) as lq_i, -- lq value index within the group
(COUNT(*) div 2) as me_i, -- me value index within the group
(COUNT(*) * 3 div 4) as uq_i -- uq value index within the group
FROM test
GROUP BY e32
) as cnts
USING (e32)
GROUP BY e32;
如果分组中不需要,查询会稍微简化一下。
P.S。 test
是我的随机值游乐桌,其中e32
是Python int(random.expovariate(1.0) * 32)
等的结果。