0

テキストの壁についてお詫び申し上げます。最後の例は私の質問を説明しています。どんな助けでも大歓迎です、ありがとう!

他の値の電圧と電流の中からのデータのいくつかの列を含むテーブルがあります。

これらのインスタンスは、電流が流れているときに毎秒記録されます。これらの値から近似値kJを計算したいと思います。kW

基本的にinstances、以下を含む1 つのテーブルがあります。

  • instanceID
  • location
  • current
  • voltage
  • time.

そして、次のsetsものを含む別のもの:

  • instanceID
  • setID.

これinstanceIDは同じで、instanceIDin インスタンスはセットを指す FK です。インスタンス内のすべての場所には、約 23 行 (さまざま) があります。30ヶ所あります。したがって、インスタンスの場所が 1 の 23 行、同じインスタンスの場所が 2 の別の 23 行などがあります。Time は、測定データが取得されたときの記録された時間です (つまり、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

kW23 セットの 1 つからの乱数であり、とにかく概算であるため問題ありませんが、クエリですべての場所のインスタンスのみをCOUNT(IF())カウントする場合は、インスタンス テーブル内のすべてのインスタンスをカウントしています。

を試しましたが、最後のMAX(CAST(time AS SIGNED)) - MIN(CAST(time AS SIGNED))場所からの最大時間から最初の場所の最小時間を引いた時間がかかります。一度に 1 つの場所に分離したいと考えています。

私がやりたいのは、その総量を取得することですkJ。これは、電力があった時間にその時間の kW を掛けたものです。インスタンス間の時間は常に 1 秒であることはわかっているので、個々の場所のインスタンス数を数えて を掛ければ十分ですが、 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

そして、kJID 1 が場所 1 と場所 2 にあったインスタンスの数を要約し、ID 2 について同じことを行い、これを次のような 1 つのテーブルにすべて表示する を追加します。

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

現在、回答をテストすることはできませんが、必要なのはGROUPBYのようです。

次のクエリは、インスタンス/場所のすべてのセットの電流と電圧を平均して、値を計算する例です。

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

これは、テーブル内の連続する行をグループ化しようとしている例です。あなたの例では、それらはインターリーブされていませんが、インターリーブされる可能性があると思います。同じインスタンス ID と場所を持つすべてのものを同じグループに割り当てる必要があります。

私のアプローチは、次に高いインスタンス/場所のペアを見つけて、それをグループ識別子として割り当てることです。サブクエリを使用してこれを行います。この識別子を取得したら、各グループを要約します。

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 に答える