【问题标题】:select from sql database with avg function使用 avg 函数从 sql 数据库中选择
【发布时间】:2014-03-03 10:37:11
【问题描述】:

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

id , 名称 , var1

我想写一个这样的 sql 查询:

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

请注意,我想在最后一个 var1 大于每个名称的 var1 平均值的名称之间进行选择

我写了这段代码:

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。

谁能帮帮我?

【问题讨论】:

  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?
  • 我正在使用 Mysql 数据库
  • 我已根据您的最新编辑修改了我的解决方案,请检查并告诉我是否有效
  • 谢谢,我有大约 28Mb 的数据,响应时间太长,我要创建一个较小的数据库,就像我已经拥有的一样,并在其上进行测试...
  • 我有这个数据:john,2 john,5 john,3 mike,3 mike,10 mike,1 和这个代码:SELECT y.* FROM test y INNER JOIN (SELECT name, AVG( val) AS av, MAX(id) AS mx FROM test GROUP BY name ) tab ON y.name = tab.name AND y.id = tab.mx AND y.val > tab.av 但我什么也没得到!

标签: mysql sql average


【解决方案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的代码

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

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

【讨论】:

  • 谢谢,它有效,但我还有一个问题,如果我想从 n 个最近的数据中获得该平均值该怎么办?
  • 好吧,越来越有趣了!在 ant other DB 中,使用 Row_Number 函数会很容易,但在 MySQL 中,我们需要加倍努力才能完成您的最新要求。我会试试的。
  • 谢谢你,我在等……下一个也许是最后一个问题是:gettin n last row that greater than avg of m rows :)
  • 你的问题很有趣。您为什么不将它们放在另一个页面中,以便其他人也可以从中受益,并且其他成员也可以提出解决方案。请将查询页面的链接分享给我。
  • 谢谢,但我该怎么做呢?你的意思是我应该开一个新话题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
相关资源
最近更新 更多