我有一个数据库,如下所示
id,名称,变量1
我想编写这样的sql查询:

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

注意,我想在名称之间选择最后一个var1大于每个名称的var1的avrage
我写这段代码:
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。
有人能帮我吗?

最佳答案

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 variable保存我们要在每个组中选择的记录数
检查SQL Fiddle处的代码
现在在外部查询中,我们可以获取上面返回的结果集的平均值。
如果你能用我的投入实现你想要的,请告诉我。

09-25 16:49
查看更多