Votre première requête, vous feriez mieux de l'écrire comme ceci :
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
Non seulement il est plus propre de faire l'ordre explicitement en cas de besoin, pas dans une sous-requête, mais le faire dans une sous-requête peut également conduire à un mauvais plan d'exécution (ce qui signifie de mauvaises performances en cas de table temporaire).
Pour votre résultat final, vous ne devez pas appliquer directement le GROUP BY et ainsi de suite. Les SELECT (et donc vos variables et calculs) sont évalués après le GROUPE PAR. Pour faire le regroupement après vos calculs, placez votre requête dans une sous-requête :
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