我有一个如下所示的数据库
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。
任何人都可以帮助我吗?
答案 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
处的代码现在在外部查询中,我们可以获取上面返回的结果集的平均值。
如果你能用我的输入完成你想要的东西,请告诉我。