0

MYSQL データベースから取得した結果を、タイムスタンプの時間ごとにグループ化したいと考えています。タイムスタンプは、形式でテーブルに格納されます2012-12-14 03:19:09。クエリを使用します

SELECT
    HOUR(`timestamp`) AS `hour`,
    AVG(`somevalue`) AS `average`
FROM ...
GROUP BY
    HOUR(`timestamp`),
    DAY(`timestamp`),
    MONTH(`timestamp`),
    WEEK(`timestamp`),
    YEAR(`timestamp`)
ORDER BY ...
LIMIT 0, 24;

これは機能し、正しい行と値を返します...

+------+-------+
| hour | value |
+------+-------+
| 13   | 21.16 | 
| 12   | 21.11 |
| 11   | 20.88 |
| 10   | 20.93 |
|  9   | 20.87 |
|  8   | 20.89 |
| ...  | ...   |
+------+-------+ 

...しかし、非常に遅いです(テーブルには〜90k行が含まれています)。各日付エンティティでグループ化するのではなく、 でグループ化するようにアドバイスされましたUNIX_TIMESTAMP(`timestamp`)/3600。残念ながら、これは望ましい結果にはつながりません。結果は次のようになります

+------+-------+
| hour | value |
+------+-------+
| 13   | 21.20 |
| 13   | 21.20 |
| 13   | 21.20 |
| 13   | 21.20 |
| 13   | 21.20 |
| ...  | ...   |
+------+-------+ 

それらを1つのグループ句のみでグループ化する方法はありますか(これにより高速になります)、正しい結果が返されますか?

4

2 に答える 2

1

それを行う代わりに、日付と時間でグループ化を使用します

SELECT
    HOUR(`timestamp`) AS `hour`,
    AVG(`somevalue`) AS `average`
FROM ...
GROUP BY
    DATE(`timestamp`),
    HOUR(`timestamp`),
ORDER BY ...
LIMIT 0, 24;
于 2013-01-20T13:47:32.463 に答える
0
  1. タイムスタンプ列にインデックスを付けます。
  2. 試してみてくださいGROUP BY DATE_FORMAT(timestamp,'%Y%m%d%H')

私は実際にこれを自分で試していないことに注意してください。

于 2013-01-20T13:11:04.443 に答える