【问题标题】:Show the average value of a group in MySQL在 MySQL 中显示一个组的平均值
【发布时间】:2021-08-16 21:13:24
【问题描述】:

我的 MySQL 表包含一个存储用户体重的字段和一个日期字段。我正在尝试查询显示一周的平均体重。

到目前为止,我的查询如下所示:

SELECT Table.`id`,
       Table.`weight`,
       Table.`date`
FROM Table
WHERE id=%CURRENT_USER_ID%
ORDER BY date ASC
GROUP BY week(date); 

此查询会生成一个列表,其中的结果按周分组。 但我还需要每周的平均体重。现在它只显示一个条目的重量。

如何进行此查询?

【问题讨论】:

  • 使用AVG(weight)

标签: mysql sql average


【解决方案1】:

小心。您的 SQL 无效,即使 MySQL 可以配置为允许它。

这是functional dependence 的问题。 SELECT 列表术语必须是 functionally dependent 上的 GROUP BY 术语。

您选择了id,它在功能上不依赖于week(date)。换句话说,您的架构/逻辑不能保证每个week(date) 组最多有一个id 值。尝试选择 date 也是如此,也不能保证每周只解析一个值。

您的WHERE 子句也是一个问题。 % 可用作 LIKE 表达式中的模式,但不能与 = 运算符一起使用,并且未正确引用为文字。我会留下'CURRENT_USER_ID' 来代表你的价值,假设那是正确的类型。问题中未显示表定义。

原始查询的更正版本是:

SELECT week(`date`)  AS the_week
     , MIN(`weight`) AS min_weight
     , MIN(`id`)     AS min_id
  FROM Table
 WHERE id='CURRENT_USER_ID'
 GROUP BY week(date)
 ORDER BY the_week ASC
;

注意:以上使用SELECT列表中的聚合函数MIN。这些表达式在功能上取决于GROUP BY 术语。也可以使用AVG函数,像这样:

SELECT week(`date`)  AS the_week
     , AVG(`weight`) AS avg_weight
  FROM Table
 WHERE id='CURRENT_USER_ID'
 GROUP BY week(date)
 ORDER BY the_week ASC
;

在 MySQL 中,我们可以在 GROUP BY 术语中使用派生列名/别名。

SELECT week(`date`)  AS the_week
     , AVG(`weight`) AS avg_weight
  FROM Table
 WHERE id='CURRENT_USER_ID'
 GROUP BY the_week
 ORDER BY the_week ASC
;

这是一个开始。

【讨论】:

    【解决方案2】:

    您可以进行一些更改并获得所需的输出。 用这个

     SELECT Table.`id`,
           Table.`weight`,
           Table.`date`,
           Avg('Table.weight')'Average Weight'
    FROM Table
    WHERE id=%CURRENT_USER_ID%
    ORDER BY date ASC
    GROUP BY week(date);
    

    【讨论】:

      猜你喜欢
      • 2020-04-07
      • 1970-01-01
      • 2020-02-20
      • 2017-04-12
      • 2016-11-25
      • 2021-10-02
      • 2013-03-24
      • 1970-01-01
      相关资源
      最近更新 更多