2014-09-23 35 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 

它似乎工作!