繁体   English   中英

显示MySQL中一组的平均值

[英]Show the average value of a group in MySQL

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

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

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

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

我该如何查询?

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

这是一个functional dependence的问题。 SELECT列表项必须在functionally dependentGROUP BY项。

您选择了id ,它在功能上不依赖于week(date) 换句话说,您的架构/逻辑不保证week(date)组最多有一个id值。 尝试 select 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列表中的聚合 function MIN 这些表达式在功能上依赖于GROUP BY项。 也可以使用AVG function,像这样:

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
;

这是一个开始。

你可以做一点改变,得到你想要的 output。使用这个

 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM