これらすべてのフィールドをグループ化するのではなく、より単純な(そしてより高速な)ソリューション(ここ )は次のようになります:
GROUP BY UNIX_TIMESTAMP(timestamp_local)/3600
あなたのクエリがあなたが望む結果を返すとは想像できません(私があなたの要件を正しく理解している場合)。特定の時間に行がない場合、時間<その時間のすべての行の合計を計算する必要があるため、要件を理解しています。 MySQLは(サブクエリ部分に対して)空のグループを選択しません。
私が知っているMySQLでこれを行う簡単で効率的な方法はありません。私は、あなたが見ている範囲内のすべての可能なグループ化値(おそらくループを使用)で一時テーブルを作成することをお勧めします。おそらく、このテーブルを数年間事前に設定し、必要に応じて行を追加することができます。次に、このテーブルとテーブルをそのまま結合します。
MSSQLを使用している場合は、再帰CTEを使用できますが、これはおそらく非常に低速でした。 これを見てください
または、MySQLの代替の場合はgoogle"mysqlcte"。再帰を使用してこれを行う方法は、(左)同じテーブルでHOUR = HOUR+1
を繰り返し結合することです。 NULL以外の値を取得するまで、停止します。これらのそれぞれについて、合計を逆算します。