La tua prima domanda è meglio che tu la scriva così:
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 solo è più pulito eseguire l'ordine in modo esplicito quando necessario, non in una sottoquery, ma farlo in una sottoquery potrebbe anche portare a un piano di esecuzione errato (il che significa prestazioni scadenti in caso di tabella temporanea).
Per il tuo risultato finale, non dovresti applicare direttamente il GROUP BY e così via. Il SELECT (e quindi le tue variabili e calcoli) vengono valutati dopo il GRUPPO BY. Per eseguire il raggruppamento dopo i tuoi calcoli, inserisci la tua query in una sottoquery:
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