2012-04-05 37 views
1

獲得由平均場的差異有序專欄中,我有一個表,如:如何從一些表中的SQL

Table

我在平均值的差的函數命令行v字段。

例如:

所有F1:

v1= 1; 
v2 = 10; 
v3 = 451; 
average(f1) = ((abs(1-10))+(abs(10-451)))/3; 
average(f2) = .... 

,所以我必須有這個平均後代模式排序的列。

是否可以使用一個SQL查詢?有人能幫我嗎?

+0

你正在使用哪種sql變體? MySQL的? SQL Server 2008? – 2012-04-05 17:01:24

+0

字段'v'應該在最終輸出中嗎? – 2012-04-05 17:02:05

+0

@MattFenwick不,它沒有問題 – JackTurky 2012-04-05 17:03:03

回答

5

您不必計算所有值之間的差異,只需要知道最小值,最大值和值的數量。

如果你看看這些值:

(abs(1-10) + abs(10-451))/3 

如果你只是總是從大減去較小的,你不需要abs

((10-1) + (451-10))/3 

的括號內不所以你得到:

(10 - 1 + 451 - 10)/3 

在這裏你可以省略內部值10,因爲您有+10-10。你最終只用最大和最小的值:

(451 - 1)/3 

不要緊,你有多少箇中間值有,他們永遠elliminated本身,例如(b-a)+(c-b)+(d-c)+(e-d)+(f-e) = (f-a)

所以,對於這個SQL將是:

select name, (max(v) - min(v))/count(*) as averageDiff 
from TheTable 
group by name 
order by averageDiff desc 

注:我不知道這是什麼平均值的差異應該是說,但你除以項目數的平均差異,但您可能希望將其與差異數相除,即比項目數少一個; (count(*) - 1)

+0

很好的答案..我會嘗試..因爲我需要這種差異,因爲我必須在圖表上顯示它們 – JackTurky 2012-04-05 17:13:27