2017-08-18 13 views
0

私はこのようなテーブルを持っているの平均取得:特定の時間枠の値と特定のエントリタイプ

ID | Type | Value | Timestamp 
-------------------------------- 
1 | AAA | 0.5 | day 1 hour 1 
2 | BBB | 1.5 | day 1 hour 1 
3 | CCC | 1.8 | day 1 hour 1 
..... 
11 | AAA | 0.6 | day 1 hour 2 
12 | BBB | 1.4 | day 1 hour 2 
13 | CCC | 1.5 | day 1 hour 2 
..... 


ID := Int, PK, AI, and so on 
Type := String/Varchar 
Value := Double 
Timestamp := Unix Timestamp (Int), could be easily changed to date type 

私が欲しいものは今、特定の時間枠の平均です。たとえば、

すべてのAAAとすべてのBBBの平均値が1日目と3日目になるようにします。 毎日、タイプごとに24個のエントリが数日間に渡って存在します。

期待される結果は、私は、これはMySQLでだけ可能であるかどうかわからないんだけど

Type | Average | Timestamp/Date 
------------------------------- 
AAA | 0.5242 | Day 1 
AAA | 0.5442 | Day 2 
AAA | 0.5913 | Day 3 
BBB | 1.4228 | Day 1 
BBB | 1.6924 | Day 2 
BBB | 1.3018 | Day 3 

だろう。おそらくPHPでそれを行う方が効率的でしょうか?

+0

1.それです。 2.そうではありません。 – Strawberry

答えて

1

これで必要な結果が得られますか?

# DROP TABLE IF EXISTS likeThis; 

CREATE TABLE likeThis (id INT UNSIGNED, `type` CHAR(255), `value` DECIMAL(2,1), `timestamp` CHAR(255)); 

INSERT INTO likeThis VALUES 
    (1, 'AAA', 0.5, 'day 1 hour 1'), 
    (2, 'BBB', 1.5, 'day 1 hour 1'), 
    (3, 'CCC', 1.8, 'day 1 hour 1'), 
    (11, 'AAA', 0.6, 'day 1 hour 2'), 
    (12, 'BBB', 1.4, 'day 1 hour 2'), 
    (13, 'CCC', 1.5, 'day 1 hour 2'); 

SELECT * FROM likeThis; 

SELECT type, AVG(`value`) average, LEFT(`timestamp`, INSTR(`timestamp`, 'hour') - 2) timestampDate FROM likeThis GROUP BY `type`, LEFT(`timestamp`, INSTR(`timestamp`, 'hour') - 2); 

日はここで、フィールドタイプが異なるに格納されている場合、クエリを適合させる方法について

は、いくつかの例のクエリがある、ない場合は、私に教えてください:

# How to aggregate by day on a DATETIME field type timestamp 
SELECT type, AVG(`value`) average, DATE_FORMAT(`timestamp`, '%Y%m%d') timestampDate FROM likeThis GROUP BY `type`, DATE_FORMAT(`timestamp`, '%Y%m%d'); 

# How to aggregate by day on a unix timestamp (stored as INT) field type timestamp 
SELECT type, AVG(`value`) average, `timestamp` - `timestamp` % 86400 timestampDate FROM likeThis GROUP BY `type`, `timestamp` - `timestamp` % 86400; 

おかげで、

James

+0

タイムスタンプは文字列ではありません。 私はunixのタイムスタンプ(int)を書きましたが、 ですが、これをDateに変更しました。 - 「タイムスタンプ:= Unixタイムスタンプ(Int)、簡単に日付タイプに変更できます」 - それはちょうどダミーコードだったので、より良いundestandingのために – Wed

+0

OK、少し答えを追加します、それは単なる操作の問題ですタイムスタンプフィールドは、グループのために必要な解像度に –

+0

私のテーブルのためのいくつかの変更の後、それは魅力のように働いた。どうもありがとうございました! – Wed

関連する問題