3

私の同僚は、次のように記述できるスキーマを見ています。

+--------------------+-----------+
| DATETIME timestamp | INT value |
+--------------------+-----------+

5 分ごとに、その瞬間の値を含む行が入力されます。

ここがややこしいところです。彼は、7 日間隔内の 8 時間ごとの平均を取得したいと考えています。

確かに、クライアント側のコードを含むソリューションを思いつくことができます。SQL でさらに多くのことができるかどうか疑問に思っていました。

したがって、本質的に、彼は次のことを望んでいます。

SELECT timestamp, value
  FROM table
 WHERE timestamp >= NOW() - INTERVAL 7 DAYS 
   AND timestamp <= NOW();

それを 8 時間のブロックに分割し、各ブロックの内容を平均します。(各ブロックには 12 行が必要で、1 日あたり 3 つのブロックが必要です)。

4

2 に答える 2

1

試す

SELECT avg(`value`)
FROM `table`
WHERE timestamp >= NOW() - INTERVAL 7 DAY AND timestamp <= NOW()
group by concat(date(`timestamp`), case when hour(`timestamp`) between 0 and 7 then 1
                                        when hour(`timestamp`) between 8 and 15 then 2
                                        else 3 end)
于 2012-07-31T15:15:52.443 に答える
0

リクエストでそれを行うだけで縛られていない場合は、リクエストを行う前に間隔を分割する次の方法を試すことができます。

boundary1 = NOW()
boundary2 = NOW()

FOR i = 0 to 21 //7 days, 3 intervals of 8 hours per days
    boundary1 = boundary2
    boundary2 = boundary1 - seconds(8 hours)
    req = "SELECT timestamp, value FROM table WHERE timestamp >= "+boundary2+" AND timestamp <= "+boundary1
ENDFOR
于 2012-07-31T15:12:05.370 に答える