我有一个数据库,如下所示
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处的代码
现在在外部查询中,我们可以获取上面返回的结果集的平均值。
如果你能用我的投入实现你想要的,请告诉我。