从avql函数中选择sql数据库

时间:2014-03-03 10:37:11

标签: mysql sql average

我有一个如下所示的数据库

id,name,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中获取,我不知道这是否有效!

例如我们有这些数据:

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

=>对于John,我们有:32 + 21 + 11/3 = 21.3,但最后的数据是11,所以John不应该被选中 =>对于Mike来说,var1的avrage是24,而Mike的最后一行是45,比avrage更大,所以应该选择Mike。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

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

处的代码

现在在外部查询中,我们可以获取上面返回的结果集的平均值。

如果你能用我的输入完成你想要的东西,请告诉我。