sql >> Databasteknik >  >> RDS >> Mysql

Räknar icke sammanhängande värden

Din första fråga bör du skriva så här:

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

Det är inte bara mer rent att göra beställningen explicit när det behövs, inte i en underfråga, att göra det i en underfråga kan också leda till en dålig exekveringsplan (vilket innebär dålig prestanda i händelse av en tillfällig tabell).

För ditt slutliga resultat bör du inte direkt använda GROUP BY och så vidare. SELECT (och därmed dina variabler och beräkningar) utvärderas efter GROUP BY. För att göra grupperingen efter dina beräkningar, placera din fråga i en underfråga:

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. ORA-00972 identifierare är för långt alias kolumnnamn

  2. Hur gör man mySQL-databas på min lokala plats tillgänglig från olika maskiner?

  3. MariaDB LENGTH() vs LENGTHB():Vad är skillnaden?

  4. Kompatibilitetsnivåer och Cardinality Estimation Primer