Вместо групиране по всички тези полета, по-просто (и по-бързо) решение (от тук ) може да бъде:
GROUP BY UNIX_TIMESTAMP(timestamp_local)/3600
Не мога да си представя, че вашата заявка връща резултатите, които искате (ако разбирам правилно вашите изисквания). Разбирам вашите изисквания, тъй като, когато няма редове за даден час, искате да изчислите сумата от всички редове с час <този час. MySQL няма да избере празни групи (за частта на подзаявката).
Няма лесен ефективен начин да направите това в MySQL, за който знам, бих предложил да създадете временна таблица с всички възможни стойности на групиране в диапазона, който гледате (вероятно с цикъл). Вероятно можете да настроите тази таблица предварително за няколко години и евентуално да добавите редове, както е необходимо. След това можете просто да се присъедините наляво към тази маса и вашата маса.
Ако сте използвали MSSQL, бихте могли да използвате рекурсивен CTE, въпреки че това вероятно щеше да е много бавно. Погледнете това
или google "mysql cte" за MySQL алтернативи. Начинът да направите това с рекурсия е (вляво) да се присъедините към една и съща таблица многократно за HOUR = HOUR+1
докато получите различна от NULL стойност, след което спрете. За всяко от тях ще изчислите сумата обратно.