MySQL从多个组标准中提取平均数据

时间:2013-02-27 15:07:48

标签: mysql mysql-workbench

为文本墙道歉,最后的例子解释了我的问题。感谢任何帮助,谢谢!

我有一个表,其中包含其他值电压和电流的几列数据。

当电流流过时,会每秒记录这些实例。我想从这些值中计算出近似的kJkW

基本上我有一个表 instances ,其中包含:

  • instanceID
  • location
  • current
  • voltage
  • time

另一个 sets ,其中包含:

  • instanceID
  • setID

instanceID是相同的,实例中的instanceID是指向集合的FK。对于实例中的每个位置,大约有23行(不同)。有30个地点。所以我有23行,其中实例具有位置1,另外23行用于位置2的相同实例,依此类推。时间是获取测量数据的记录时间(因此,如果所有23个实例之间的差异为1秒,则第一次和最后一次之间的差异为23秒)。

我需要计算平均kW和总kJ(近似值)。

我所做的是以下内容:

SELECT instances.instanceID, location, current, 
       voltage, current * voltage AS kW, 
       COUNT(IF(current > 0 AND voltage > 0, 
                instances.instanceID, 
                0)) AS InstancedTime
FROM instances
INNER JOIN sets ON instances.instanceID = sets.instanceID
WHERE sets.setID = arbitrary_number;

问题出现了,我得到下表:

instanceID, location, current, voltage, kW, InstancedTime

kW是来自23个集合中的一个的随机数,这很好,因为它无论如何都是近似值,但COUNT(IF())正在计算 ALL 中的实例实例表,当我只希望查询计算每个位置的实例时。

我尝试了MAX(CAST(time AS SIGNED)) - MIN(CAST(time AS SIGNED)),但这需要从 last 位置减去第一个位置的最小时间的最长时间,我想隔离它一次到一个地方。

我想要做的是获得kJ的总量,即它的功率乘以当时的kW。由于我知道实例之间的时间总是1秒,因此应该足以计算单个位置的实例数,并将其乘以kW,但是我想对所有实例进行此操作一套。可以通过对所有单个实例使用单个查询来替换集合,但这将花费很长时间。

我正试图拿一张看起来像

的桌子
instanceID, location, current, voltage, kW, InstancedTime
1, 1, 500V, 2A, 1kW, 1s
1, 1, 500V, 2A, 1kw, 1s
1, 2, 400V, 3A, 1.2kW, 1s
1, 2, 400V, 3A, 1.2kW, 1s
2, 1, 700V, 2A, 1.4kW, 1s
2, 1, 700V, 2A, 1.4kw, 1s
2, 2, 300V, 3A, 0.9kW, 1s
2, 2, 300V, 3A, 0.9kW, 1s

添加kJ,它将总结ID 1在位置1和位置2中的实例数量,对ID 2执行相同操作并在一个表中显示所有内容,如下所示: / p>

instanceID, location, current, voltage, kW, SumInstancedTime, kJ
1, 1, 500V, 2A, 1kW, 2s, 2kJ
1, 2, 400V, 3A, 1.2kW, 2s, 2.4kJ
2, 1, 700V, 2A, 1.4kW, 2s, 2.8kJ
2, 2, 300V, 3A, 0.9kW, 2s, 1.8kJ

感谢您的时间,感谢任何提供的帮助!

2 个答案:

答案 0 :(得分:1)

我现在无法测试我的答案,但听起来你需要的是GROUP BY:

以下查询是一个示例,它平均每组实例/位置的当前和电压,然后计算值

SELECT instances.instanceID, location, AVG(current) as avg_current, 
       AVG(voltage) as avg_voltage, AVG(current) * AVG(voltage) AS kW, 
       COUNT(IF(current > 0 AND voltage > 0, 
                instances.instanceID, 
                0)) AS InstancedTime
FROM instances
INNER JOIN sets ON instances.instanceID = sets.instanceID
WHERE sets.setID = arbitrary_number;
GROUP BY instances.instanceID, location

答案 1 :(得分:0)

这是您尝试对表中的连续行进行分组的示例。在你的例子中,它们不是交错的,但我假设它们可能是。您需要将具有相同instanceID和位置的所有内容分配给同一组。

我的方法是找到下一个更高的实例/位置对,并将其指定为组标识符。我使用子查询来做到这一点。一旦我有了这个标识符,我就会总结每个小组:

select i.instanceId, i.location, i.current, i.volate, i.kw, COUNT(*) as SumTime,
       SUM(kw) as KJ
from (select i.*,
             (select concat(i2.instanceId, ',', i2.location)
              from instances i2
              where i2.instanceId > i.instanceId or (i2.instanceId = i.instanceId and i2.location > i.location)
              order by i2.instanceId desc, i2.locationId desc
              limit 1
             ) as grouping
      from instances i
     ) i
group by grouping