Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Contando valores não contíguos


Sua primeira consulta é melhor você escrever assim:
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

Não só é mais limpo fazer a ordenação explicitamente quando necessário, não em uma subconsulta, como fazê-lo em uma subconsulta também pode levar a um plano de execução ruim (o que significa um desempenho ruim no caso de uma tabela temporária).

Para o seu resultado final, você não deve aplicar diretamente o GROUP BY e assim por diante. O SELECT (e, portanto, suas variáveis ​​e cálculos) são avaliados depois o GRUPO POR. Para fazer o agrupamento após seus cálculos, coloque sua consulta em uma subconsulta:
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