メモリ データとタイムスタンプを保持する MySQL データベースがあります。システムで使用されているメモリや使用可能なメモリの合計などの非常に単純なデータ。ここで、このデータを使用していくつかの簡単な計算を行った後、MySQL VIEW を作成して、ある程度のデータ平滑化を実現したいと考えています (平均にローリング ウィンドウを使用)。
最初のテーブルは次のようになります。
id |date |mem_used |mem_total
1 |2012-03-16 23:29:05 |467 |1024
2 |2012-03-16 23:30:05 |432 |1024
3 |2012-03-16 23:31:05 |490 |1024
4 |2012-03-16 23:33:05 |501 |1024
5 |2012-03-16 23:35:05 |396 |1024
6 |2012-03-16 23:39:05 |404 |1536
7 |2012-03-16 23:43:05 |801 |1536
作成された VIEW は次のようになります。
id |date |mem_used |mem_total |mem_5_min_avg |mem_rate_usage
1 |2012-03-16 23:29:05 |467 |1024 |473 |0.46191406
2 |2012-03-16 23:30:05 |432 |1024 |455 |0.44433594
3 |2012-03-16 23:31:05 |490 |1024 |463 |0.45214844
4 |2012-03-16 23:33:05 |501 |1024 |449 |0.43847656
5 |2012-03-16 23:35:05 |396 |1024 |396 |0.38671875
6 |2012-03-16 23:39:05 |404 |1536 |603 |0.39257813
7 |2012-03-16 23:43:05 |801 |1536 |801 |0.52148438
要件:
最初の 3 列は同じですが、列mem_5_min_avgには、 mem_totalが同じ ( mem_totalが変化している)場合、次の 5 分間の平均使用メモリが含まれている必要があります。
したがって、次の行は次のように計算する必要があります。
- mem_5_min_avg 列の 1 行目 (467+432+490+501)/4 = 1890/4 = 472.5 = 473 <- 2012-03-16 23:29:05 プラス 5 分 2012-03 なので、ここで 4 行を合計します-16 23:34:05
- mem_5_min_avg 列の 2 行目 (432+490+501+396)/4 = 1819/4 = 454.75 = 455
- mem_5_min_avg 列の 3 行目 (490+501+396)/3 = 1387/4 = 462.33 = 463
- mem_5_min_avg 列の 4 行目 (501+396)/2 = 897/2 = 448.5 = 449
- mem_5_min_avg 列の 5 行目 396 <- 次の測定が 5 分以内であっても、mem_total が変化しているため、ここでは行を合計しません。
- mem_5_min_avg 列の 6 行目 (404+801)/2 = 1205/2 = 602.5 = 603
- mem_5_min_avg 列の 7 行目 801
mem_5_min_avgが計算された後、mem_rate_usage列が必要です。これは、パーセンテージで指定されたメモリ使用量の単純な割合を示します。
mem_rate_usage = mem_5_min_avg / mem_total
たとえば、mem_rate_usage の 3 行目は463 /1024=0.45214844 のように計算する必要がありますが、最後の列は 801/1536=0.52148438 のように計算する必要があります。
これにアプローチする方法についての手がかりがありません。「GROUP by」と組み合わせて「AVG」機能を試してみましたが、実際にはここで何もグループ化したくありません。作成されたビューに同じ数の行とデータを持ち、さらに平滑化されたデータとレートが必要です。