【问题标题】:SQL AVG() function returning incorrect valuesSQL AVG() 函数返回不正确的值
【发布时间】:2012-11-08 10:30:20
【问题描述】:

我想在 sql 中使用 AVG 函数来返回一些值的工作平均值(即基于上周而不是总体平均值)。我正在计算两个值,weightrestingHR(心率)。我对每个都有以下 sql 语句:

SELECT AVG( weight ) AS average 
FROM   stats 
WHERE  userid='$userid' 
ORDER BY date DESC LIMIT 7

SELECT AVG( restingHR ) AS average 
FROM   stats 
WHERE  userid='$userid' 
ORDER BY date DESC LIMIT 7

weight 我得到的值是 82.56 但应该是 83.35 这不是一个大错误,我在使用它时会四舍五入,所以没什么大不了的。

但是对于 restingHR,我得到 45.96 而应该是 57.57,这是一个巨大的差异。

我不明白为什么会出现这样的问题。非常感谢任何帮助。

谢谢

【问题讨论】:

  • 你怎么知道值应该是83.35?请问您可以发布您正在使用的数据吗?
  • 您确定使用的列不包含NULL 值吗?
  • 这里的order bylimit 到底是什么意思?
  • 粘贴这个查询的结果,让我们看看你的数据SELECT weight AS average FROM stats WHERE userid='$userid' ORDER BY date DESC LIMIT 7
  • 您可以尝试使用 between 进行过滤,而不是使用 order by:WHERE userid='$userid' and date BETWEEN '01/11/2012' and '09/11/2012'...跨度>

标签: sql average


【解决方案1】:

使用子查询将选择行与计算平均值分开:

SELECT AVG(weight) average
FROM (SELECT weight
      FROM stats
      WHERE userid = '$userid'
      ORDER BY date DESC
      LIMIT 7) subq

【讨论】:

  • +1 :只是为了补充这个答案,因为它没有明确说明为什么这是必要的:LIMIT 7 限制可以输出多少行。聚合时,提供给聚合的记录数根本不受影响。例如,SELECT x, AVG(y) FROM z GROUP BY x ORDER BY x LIMIT 7 将返回 x 的 7 个不同值的结果,但每一行都可以是一百万行的总和。在您的情况下,您希望限制聚合的行数。通过使用子查询,您可以使用LIMIT 仅选择 7 行,然后使用外部查询进行聚合。
  • 感谢这完美的工作。我需要增加我的 SQL 知识,但只学习了我需要的东西。到目前为止,大部分都是简单的东西。
  • 要记住的重要一点是 LIMIT 和 ORDER BY 对结果进行操作,正如 tombom 所说。你写它的方式,它的意思是“返回最多 7 行的平均值”,而不是“返回最多 7 行的平均值”。
【解决方案2】:

您似乎想使用ORDER BY date DESC LIMIT 7 过滤您的数据,但您必须考虑到,ORDER BY 子句在其他所有操作完成后才生效。因此,您的 AVG() 函数会考虑您的 $userId 中 restingHR 的所有值,而不仅仅是最新的 7 个值。

为了克服这个问题...好吧,Barmar 刚刚发布了一个查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 2018-03-10
    相关资源
    最近更新 更多