Mysql
 sql >> Base de données >  >> RDS >> Mysql

Compter des valeurs non contiguës

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