sql >> Database >  >> RDS >> Mysql

Niet-aaneengesloten waarden tellen

Je eerste vraag kun je beter zo schrijven:

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

Het is niet alleen schoner om de bestelling expliciet uit te voeren wanneer dat nodig is, niet in een subquery, maar als u het in een subquery doet, kan dit ook leiden tot een slecht uitvoeringsplan (wat slechte prestaties betekent in het geval van een tijdelijke tabel).

Voor uw eindresultaat moet u de GROUP BY enzovoort niet rechtstreeks toepassen. De SELECT (en dus je variabelen en berekeningen) worden geëvalueerd na de GROEP DOOR. Om de groepering na uw berekeningen uit te voeren, plaatst u uw zoekopdracht in een subquery:

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. c# mysql AddWithValue unicode

  2. Forceer in Postgresql uniek op combinatie van twee kolommen

  3. Een waarde retourneren, zelfs als er geen resultaat is

  4. Kan DLL 'SqlServerSpatial.dll' niet laden