2014-03-03 109 views
2

我有一個數據庫,如下圖所示從SQL數據庫AVG函數選擇

ID,姓名,VAR1

,我想寫一個sql查詢是這樣的:

select name 
from table 
where last var1 > avg of var1 s of each name 

注意我想選擇最後var1大於每個名稱的var1s的平均值的名稱

我寫這個代碼:

select name 
from table 
where var1>(select avg(var1) from table) limit 0 , 1 

但這段代碼從所有var1中獲取avrage,我不知道這是否有效!

例如我們有這些數據:

1 , John , 32 
2 , John , 21 
3 , Mike , 22 
4 , John , 11 
5 , Mike , 5 
6 , Mike , 45 

=>爲約翰,我們有:32 + 21 + 11/3 = 21.3,但最後的數據是11,所以約翰不應該被選擇 = >對於邁克,var1的平均值是24,邁克的最後一行是45,這大於平均值,所以應該選擇邁克。

任何人都可以幫助我嗎?

+1

您正在使用哪些DBMS? Postgres的?甲骨文? –

+0

我正在使用Mysql數據庫 –

+0

我已根據您最近的修改修改了我的解決方案,請檢查並讓我知道它是否有效 –

回答

1
SELECT y.* FROM 
your_table y 
JOIN 
(
    SELECT name, AVG(var1) AS av, MAX(id) AS mx 
    FROM your_table 
    GROUP BY name 
) tab 
ON y.name = tab.name 
AND y.id = tab.mx 
AND y.var1 > tab.av 

這裏是SQL Fiddle

[編輯]代碼:根據您的最新要求 ,你要完成的是LIMIT N within group,可以用下面的查詢來完成:

SET @N := 2; 
SELECT * FROM 
( 
    SELECT (@rownumber:= @rownumber + 1) AS rn, yt.* 
    FROM your_table yt,(SELECT @rownumber:= 0) nums 
    ORDER BY name, id 
) k 
JOIN 
(
    SELECT t.name, MAX(rn) AS MaxRN FROM 
    ( 
     SELECT (@rownumber:= @rownumber + 1) AS rn, yt.* 
     FROM your_table yt,(SELECT @rownumber:= 0) nums 
     ORDER BY name, id 
    ) t 
    GROUP BY name 
) l 
ON k.rn <= l.MaxRN AND k.rn > l.MaxRN - @N 

這裏@N變量保存我們想要在每個組內選擇的記錄數 檢查代碼SQL Fiddle

現在在外部查詢中,我們可以獲取上面返回的結果集的平均值。

讓我知道你是否可以用我的輸入完成你想要的。

+0

謝謝,它的工作原理,但我有另一個問題,如果我想從n最近的數據得到這個avrage,我該怎麼辦? –

+0

好吧,它變得有趣!在螞蟻其他數據庫中,使用Row_Number函數會很容易,但在MySQL中,我們需要額外努力來完成最新的需求。我會嘗試。 –

+0

謝謝,我在等待... 接下來,也許最後一個問題是:最後一行,比m行平均值大:) –