2

毎分データを記録するテーブルがあります。次のようになります。

time_stamp            wh   
2013-02-01 08:00:00  1700    
2013-02-01 08:01:00  1600    
2013-02-01 08:02:00  1800    
2013-02-01 08:03:00  1700    
2013-02-01 08:04:00  1900    
2013-02-01 08:05:00  1400    
2013-02-01 08:06:00  1500    
2013-02-01 08:07:00  1700    
2013-02-01 08:08:00  1700    
2013-02-01 08:09:00  1800    
2013-02-01 08:10:00  1800    
2013-02-01 08:11:00  1400 

..等

3分ごとのデータを合計して、3分ごとの平均を求めたいです。出力は次のようになります。

time_stamp            SUM(wh)    AVG(wh)
2013-02-01 08:00:00    5100       1700
2013-02-01 08:03:00    5500       1833.3333
2013-02-01 08:06:00    4900       1633.3333
2013-02-01 08:09:00    5000       1666.6667

簡単に思えますが、望む結果が得られません。これは私が試したSQLクエリです:

SELECT from_unixtime(ROUND(unix_timestamp(time_stamp) / 
       (60*3)) * 60 * 3) AS rounded_time,
       SUM(wh),
       AVG(wh)
FROM electrex_0
WHERE time_stamp BETWEEN '2013-02-01 08:00' AND '2013-02-01 09:00'
GROUP BY rounded_time

このSQLコードを使用することで、 time_stamp を正しく取得できましたが、SUMandでは取得できませんでしたAVG。たとえばSum(wh)、2013-02-01 08:03:00 は 5100 で、08:02,08:03,08:04 からのデータを取得して合計します。

4

2 に答える 2

1

変数でそれを行う方法は次のとおりです

SET @VAR:=1;
SET @group=0;
SELECT 
    time_stamp,
    SUM(wh) AS `TotalSum`,
    AVG(wh) AS `TotalAvg`
FROM 
  (
    SELECT 
        time_stamp,
        wh,
        @VAR AS Level,
        @group AS `TGroup`,
        @group := IF(@VAR = 3,@group + 1 ,@group) ,
        @VAR := IF(@VAR = 3,1,@VAR+1 )
    FROM electrex_0
  ) AS l
GROUP BY TGroup

SQL フィドルのデモ

出力

|     TIME_STAMP                  | TOTALSUM |  TOTALAVG |
----------------------------------------------------------
| February, 01 2013 08:00:00+0000 |     5100 |      1700 |
| February, 01 2013 08:03:00+0000 |     5000 | 1666.6667 |
| February, 01 2013 08:06:00+0000 |     4900 | 1633.3333 |
| February, 01 2013 08:09:00+0000 |     5000 | 1666.6667 |
于 2013-03-20T09:07:49.553 に答える
1

どのように 5500 を取得しますか:

2013-02-01 08:03:00  1700    
2013-02-01 08:04:00  1900    
2013-02-01 08:05:00  1400  

合計すると5000くらいじゃない?

正しいデータを返すように修正されたクエリは次のとおりです。

SELECT
  from_unixtime(ROUND((unix_timestamp(time_stamp) - 60) / (60*3)) * 60 * 3) AS rounded_time,
  SUM(wh),
  AVG(wh)
FROM electrex_0
WHERE time_stamp BETWEEN '2013-02-01 08:00'
    AND '2013-02-01 09:00'
GROUP BY rounded_time

戻り値:

ROUNDED_TIME                    SUM(WH) AVG(WH)
February, 01 2013 08:00:00+0000 5100    1700
February, 01 2013 08:03:00+0000 5000    1666.6667
February, 01 2013 08:06:00+0000 4900    1633.3333
February, 01 2013 08:09:00+0000 5000    1666.6667

デモ

于 2013-03-20T08:41:53.817 に答える