2016-10-21 9 views
0

私は温度を読み取るテーブルを持っており、過去24時間の平均時間を取得する必要がありますが、現在の時間を「ラップアラウンド」します。時系列をラップアラウンドでグループ化する

私はこの文を使用します。

SELECT DISTINCT HOUR(readAt) pointTime 
       , ROUND(AVG(temperature),1) avgTemp 
      FROM TempReadings 
      WHERE readAt BETWEEN DATE(NOW() - INTERVAL 1 DAY) AND NOW()) 
      AND temperature IS NOT NULL 
      GROUP 
      BY pointTime; 

readAtはタイムスタンプです。 私は現在の時間の周りに "ラップ"を注文したいので、10.01amでクエリを実行すると、最初の行は前日の午前9時、午前10時の最後の行になります。上記のクエリから

私はこれを取得:

+-----------+---------+ 
| pointTime | avgTemp | 
+-----------+---------+ 
|   5 | 23.2 | 
|   6 | 12.9 | 
|   7 | 11.6 | 
|   8 | 14.3 | 
|   9 | 10.4 | 
|  10 | 12.5 | 
|  17 |  0.0 | 
|  18 | 23.3 | 
|  19 | 14.4 | 
|  20 | 14.6 | 
|  21 | 17.1 | 
+-----------+---------+ 

11 rows in set (0.00 sec)     ------------------ formatted as codes 

編集22.10:私は、次のテストのステートメントを使用します。

ステートメントの下
CREATE TABLE TempReadings (
readAt DATETIME NOT NULL, 
temperature FLOAT NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=big5; 

INSERT INTO TempReadings VALUES ((NOW() - INTERVAL 13 HOUR), 10); 
INSERT INTO TempReadings VALUES ((NOW()), 20); 
INSERT INTO TempReadings VALUES ((NOW() - INTERVAL 2 HOUR), 30); 
INSERT INTO TempReadings VALUES ((NOW() - INTERVAL 14 HOUR), 40); 
INSERT INTO TempReadings VALUES ((NOW() - INTERVAL 16 HOUR), 50); 

SELECT * FROM TempReadings; 
+---------------------+-------------+ 
| readAt    | temperature | 
+---------------------+-------------+ 
| 2016-10-21 20:15:38 |   10 | 
| 2016-10-22 09:15:38 |   20 | 
| 2016-10-22 07:15:38 |   30 | 
| 2016-10-21 19:15:38 |   40 | 
| 2016-10-21 17:15:38 |   50 | 
+---------------------+-------------+e 

は時間によってソートされた平均値を生成するが、私は最も古いをしたいと思います平均は最初の行になります

SELECT DISTINCT(HOUR(readAt)) as pointTime, ROUND(AVG(temperature), 1) AS avgTemp FROM TempReadings WHERE (readAt BETWEEN DATE(NOW() - INTERVAL 1 DAY) AND NOW()) AND temperature IS NOT NULL GROUP BY pointTime; 

+-----------+---------+ 
| pointTime | avgTemp | 
+-----------+---------+ 
|   7 | 30.0 | 
|   9 | 20.0 | 
|  17 | 50.0 | 
|  19 | 40.0 | 
|  20 | 10.0 | 
+-----------+---------+ 

ですから、時刻): 17(第一列)、19、20、7、9(最後)

+0

注BY。 – Strawberry

+0

この間隔を最後の24時間としたいのですか? – verhie

+0

また、データセットのない結果セットは、無駄になります。 http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-queryを参照してください。 – Strawberry

答えて

1

一つの方法は、date_format()を使用する:DISTINCTは、関数ではなく、まれGROUPと一緒に表示されないこと

SELECT HOUR(readAt) pointTime, 
     ROUND(AVG(temperature),1) avgTemp 
FROM TempReadings 
WHERE temperature IS NOT NULL AND 
     date_format(readAt, '%Y-%m-%d %h') BETWEEN 
      date_format(now() - interval 25 hour, '%Y-%m-%d %h') and 
      date_format(now() - interval 1 hour, '%Y-%m-%d %h') 
GROUP BY pointTime 
ORDER BY MIN(readAt); 
+0

上記のサンプルデータをご覧ください。あなたの出力は、私のステートメント – jchris

+0

@jchrisと同じオーダーを生成します。 。 。私の答えには明示的な「ORDER BY」はありませんでした。それが必要なのです。 –

+0

ありがとうございました。私の問題を解決! – jchris

関連する問題