[英]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 dependent
于GROUP 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.