Първата си заявка е по-добре да я напишете така:
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
Не само, че е по-чисто да се направи подреждането изрично, когато е необходимо, а не в подзаявка, извършването му в подзаявка може също да доведе до лош план за изпълнение (което означава лоша производителност в случай на временна таблица).
За вашия краен резултат не трябва директно да прилагате GROUP BY и т.н. SELECT (и следователно вашите променливи и изчисления) се оценяват след ГРУПАТА ОТ. За да извършите групирането след вашите изчисления, поставете заявката си в подзаявка:
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