2014-09-23 89 views
1

约束我有一个MySQL数据库,看起来像这样的数据:为了通过降低信心在MySQL

name |score 
---------- 
alice|60 
mary |55 
... 

名称可以在列表中出现很多次,但也可出现一次。我想要的是根据名称的95%置信区间的下限来排列列表。我试过以下内容:

SELECT name, count(*) as count_n, stddev_samp(score) as stdv, avg(score) as mean 
FROM `my.table` 
GROUP BY name 
ORDER BY avg(score)-1.96*std(score)/sqrt(count(*)) desc 

这产生一个好的输出。理想情况下,我想改变1.96的值,因为这应该取决于该名称的count_n的值。事实上,它应该是一个基于count_n-1自由度的t分布的值。有MySQL功能可以为我做这个吗?

我已经看到以下answer这看起来不错,但不会像我想的那样改变价值。

回答

0

我解决我的问题通过创建具有以下结构的sepearate表“tdistribution”:

dof | tvalue 
------------ 
1 | -12.706 
2 | -4.3026 

它包含自由和asscociated的t值的程度。然后,可以将此表与原始样式的查询结合起来。

SELECT table2.name, 
round(table2.mean-abs(tdistribution.tvalue*table2.stdv/sqrt(table2.nn)),2) AS LCB, 
round(table2.mean+abs(tdistribution.tvalue*table2.stdv/sqrt(table2.nn)),2) AS UCB 
FROM 
    (SELECT table1.name, count(table1.name) AS nn, avg(table1.score) AS mean, stddev_samp(table1.score) AS stdv 
    FROM 
     (SELECT name, score FROM my.table) AS table1 
    GROUP BY name 
    ) AS table2 
LEFT JOIN tdistribution 
ON table2.nn-1=tdistribution.dof 
WHERE nn>1 
ORDER BY LCB DESC 

它似乎工作!