2009-09-15 123 views
1

我不确定这是否可以在单个查询中实现,但我试图用MySQL实现以下功能,但尚未找到解决方案。在MySQL中将SUM和AVG与GROUP BY结合使用

我有被构造有点像这样的表:

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以及任何给定分钟的平均值的总和,只有一个或另一个。

从本质上讲,我想实现这个过程:

  • 查找ID 1所有日志的平均值19:05
  • 在19:05找到所有的日志,用于ID 2的平均
  • 查找ID 3所有日志在19:05
  • 平均添加平均值在一起以进行总共为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 

感谢您提供任何帮助。

+0

这是一个简单的查询,希望我的MySQL这里测试真正的快,它应该是这样的: 选择ID,小时+“:”原木+分钟,平均(log_value) 组由ID,小时+” :'+分钟 – BlackTigerX

回答

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 
+0

您可以从组中删除id,并选择获得所有分钟平均值,如果您需要在一个查询中全部使用union –

+0

那么您建议在SQL语句之外执行以合并平均值? – MSR

+0

如果您打算将它们列在不同的列表中,则不需要在同一个查询中写入它们,毕竟所有通用平均值都没有id字段。但是,如果您想在一个查询中使用所有查询,则可以使用najmeddine提供的查询。 –

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) 

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

(id = null做UNION)。