将SUM和AVG与MySQL中的GROUP BY相结合

时间:2009-09-15 22:53:31

标签: sql mysql logging

我不确定这是否可以在单个查询中实现,但我正在尝试使用MySQL实现以下功能,但尚未找到解决方案。

我的表格结构有点像这样:

 ID     LOG_VALUE   LOG_TIME     

  1        5000     19:05:42   
  2        6205     19:05:45
  3        1000     19:05:40  
  1        5000     19:05:52    
  2        6403     19:05:55   
  3        1500     19:05:50
  1        5000     19:06:02    
  2        6403     19:06:05   
  3        1500     19:06:00

以规则的间隔(即每10秒)将行插入此日志表中。我想查询记录以计算每分钟的综合平均log_value。

我遇到的问题是,我不确定如何计算每分钟的每个ID的平均值,以及任何给定分钟的平均值之和,只有一个或另一个。

基本来说,我想要实现这个过程:

  • 在19:05
  • 中查找ID 1的所有日志的平均值
  • 在19:05
  • 中查找ID 2的所有日志的平均值
  • 在19:05
  • 中查找ID 3的所有日志的平均值
  • 将平均值加在一起,得出总数为19:05
  • 为19:06
  • 做同样的事

下面的SQL没有按我的意愿行事,但我已将其包含在内以帮助解决问题。

SELECT ROUND(AVG(log_value)) AS average_value, EXTRACT(HOUR_MINUTE FROM log_time)
FROM (`logs`)
GROUP BY MINUTE(log_time), id
ORDER BY log_time DESC

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

尝试以下

SELECT 
   ROUND(AVG(log_value)) AS average_value, 
   EXTRACT(HOUR_MINUTE FROM log_time),
   id
FROM (`logs`)
GROUP BY 
   EXTRACT(HOUR_MINUTE FROM log_time), id
ORDER BY 
   log_time DESC

答案 1 :(得分:0)

SELECT id, 
       EXTRACT(HOUR_MINUTE FROM log_time),
       ROUND(AVG(log_value)) AS average_value
  FROM (`logs`)
 GROUP BY EXTRACT(HOUR_MINUTE FROM log_time), id
UNION ALL
SELECT null id, 
       EXTRACT(HOUR_MINUTE FROM log_time), 
       ROUND(AVG(log_value)) AS average_value
  FROM (`logs`)
 GROUP BY EXTRACT(HOUR_MINUTE FROM log_time)
ORDER BY EXTRACT(HOUR_MINUTE FROM log_time)

第一个查询计算不同的Id,HOUR_MINUTE的平均值 第二个查询计算不同HOUR_MINUTE的平均值=该HOUR_MINUTE的每个Id平均值的总和

(id = null来做UNION)。