0

为文字墙道歉,最后的例子解释了我的问题。任何帮助表示赞赏,谢谢!

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

当有电流流动时,每秒都会记录这些实例。我想从这些值计算一个近似值kJ和。kW

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

  • instanceID,
  • location,
  • current,
  • voltage,
  • time.

另一个,sets,包含:

  • instanceID,
  • setID.

instanceID相同,instanceIDin 实例是指向集合的 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())正在计算实例表中的所有实例。

我试过了MAX(CAST(time AS SIGNED)) - MIN(CAST(time AS SIGNED)),但这需要从最后一个位置减去第一个位置的最短时间最大时间,我想一次将它隔离到一个位置。

我想要做的是得到总数量,kJ即它有功率的时间乘以那个时间的千瓦。由于我知道实例之间的时间始终为 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 执行相同操作并将所有这些都显示在一个表格中,如下所示:

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

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

4

2 回答 2

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
于 2013-02-27T15:20:33.920 回答
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
于 2013-02-27T15:21:58.670 回答