Tu primera consulta es mejor que la escribas así:
SELECT guid, current_level , if(@id <> guid, @lev := 10, 0) AS useless, case when @id <> guid then @id := guid else 0 end AS useless2
, (case when (current_level = 200 AND current_level <> @lev) then 1 else 0 end) as TIMES
, if(current_level = 200 AND current_level <> @lev, @lev := current_level, 0) AS useless3
FROM sensor_logs
, (SELECT @id := 'none', @lev := 10) var_init_subquery
ORDER BY guid
No solo es más limpio ordenar explícitamente cuando es necesario, no en una subconsulta, sino que hacerlo en una subconsulta también podría conducir a un mal plan de ejecución (lo que significa un mal rendimiento en el caso de una tabla temporal).
Para su resultado final, no debe aplicar directamente GROUP BY y así sucesivamente. El SELECT (y por lo tanto sus variables y cálculos) se evalúan después el GRUPO POR. Para hacer la agrupación después de tus cálculos, coloca tu consulta en una subconsulta:
SELECT guid, SUM(times) FROM (
SELECT guid, current_level , if(@id <> guid, @lev := 10, 0) AS useless, case when @id <> guid then @id := guid else 0 end AS useless2
, (case when (current_level = 200 AND current_level <> @lev) then 1 else 0 end) as TIMES
, if(current_level = 200 AND current_level <> @lev, @lev := current_level, 0) AS useless3
FROM sensor_logs
, (SELECT @id := 'none', @lev := 10) var_init_subquery
ORDER BY guid
) sq
GROUP BY guid