Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Nicht zusammenhängende Werte zählen

Deine erste Abfrage schreibst du besser so:

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

Es ist nicht nur sauberer, die Reihenfolge bei Bedarf explizit und nicht in einer Unterabfrage durchzuführen, dies in einer Unterabfrage zu tun, kann auch zu einem schlechten Ausführungsplan führen (was im Fall einer temporären Tabelle eine schlechte Leistung bedeutet).

Für Ihr Endergebnis sollten Sie GROUP BY und so weiter nicht direkt anwenden. Die SELECT (und damit Ihre Variablen und Berechnungen) werden nach ausgewertet die GRUPPE NACH. Um die Gruppierung nach Ihren Berechnungen vorzunehmen, stellen Sie Ihre Abfrage in eine Unterabfrage:

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