次のようなデータベーステーブルがあります。
id | macaddr | load | timestamp
=========================================
1 | 0011111 | 17 | 2012-02-07 10:00:00
1 | 0011111 | 6 | 2012-02-07 12:00:00
2 | 0022222 | 3 | 2012-02-07 12:00:03
3 | 0033333 | 9 | 2012-02-07 12:00:04
4 | 0022222 | 4 | 2012-02-07 12:00:06
5 | 0033333 | 8 | 2012-02-07 12:00:10
...
ここで、今日、昨日、今週、今月など、さまざまな期間のすべてのデバイス (= mac アドレス) の平均負荷を計算したいと思います。
平均負荷は、最初に異なる時点 (サンプル日付) での全体的な負荷の合計を見つけてから、これらのサンプル日付の負荷合計の平均を計算することによって計算できます。たとえば、最後の 10 秒間 (現在は 2012 年 2 月 7 日 12:00:10) の平均負荷が必要な場合は、サンプルの日付を 12:00:02、12:00 にすることができます。 04、12:00:06、12:00:08、12:00:10。次に、各デバイスの最新の負荷値を合計して、負荷の合計を計算します。
2012-02-07 12:00:02 | 6 [= load(id=2)]
2012-02-07 12:00:04 | 18 [= load(id=2) + load(id=3) + load(id=4)]
2012-02-07 12:00:06 | 19 [= load(id=2) + load(id=4) + load(id=5)]
2012-02-07 12:00:08 | 19 [= load(id=2) + load(id=4) + load(id=5)]
2012-02-07 12:00:10 | 18 [= load(id=2) + load(id=5) + load(id=6)]
デバイスの負荷値は、たとえば 1 時間より古い場合は無視されます (ここでは id=1 に発生)。この場合、平均は 16 になります。
現在、非常に遅い多くの「UNION ALL」ステートメントを含むかなり複雑なクエリを生成しています。
SELECT avg(l.load_sum) as avg_load
FROM (
SELECT sum(so.load) AS load_sum
FROM (
SELECT *
FROM (
SELECT si.macaddr, si.load
FROM sensor_data si WHERE si.timestamp > '2012-02-07 11:00:10' AND si.timestamp < '2012-02-07 12:00:10'
ORDER BY si.timestamp DESC
) AS sm
GROUP BY macaddr
) so
UNION ALL
[THE SAME THING AGAIN WITH OTHER TIMESTAMPS]
UNION ALL
[AND AGAIN]
UNION ALL
[AND AGAIN]
...
) l
ここで、1 か月の平均負荷を計算したいとします。1 時間ごとのサンプル日付では、UNION ALL ステートメントを使用して 30x24=720 のクエリを結合する必要があります。私のマシンでは、クエリ全体が完了するまでに 1 分近くかかります。UNION ALL ステートメントを使用しない方がはるかに優れたソリューションがあると確信しています。ただし、Web 上で役立つものは何も見つかりませんでした。したがって、私はあなたの助けにとても感謝しています!