Mysql
 sql >> Database >  >> RDS >> Mysql

Conteggio di valori non contigui

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