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

Tæller ikke-sammenhængende værdier

Din første forespørgsel, du må hellere skrive den sådan her:

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

Ikke alene er det mere rent at udføre ordren eksplicit, når det er nødvendigt, ikke i en underforespørgsel, at gøre det i en underforespørgsel kan også føre til en dårlig eksekveringsplan (hvilket betyder dårlig ydeevne i tilfælde af en midlertidig tabel).

For dit endelige resultat bør du ikke anvende GROUP BY direkte og så videre. SELECT (og derfor dine variabler og beregninger) evalueres efter GRUPPE AF. For at udføre grupperingen efter dine beregninger, læg din forespørgsel i en underforespørgsel:

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



  1. Flere joinforbindelser i MySQL-tabel

  2. Standardafvigelseskommando i SQL

  3. Hvad svarer til spool-kommandoen i MySQL?

  4. MySQL DISTINCT på en GROUP_CONCAT()