Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zliczanie wartości nieciągłych

Twoje pierwsze zapytanie lepiej napisz tak:

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

Nie tylko czystsze jest jawne porządkowanie w razie potrzeby, a nie w podzapytaniu, wykonanie tego w podzapytaniu może również prowadzić do złego planu wykonania (co oznacza złą wydajność w przypadku tabeli tymczasowej).

Aby uzyskać ostateczny wynik, nie należy bezpośrednio stosować funkcji GROUP BY i tak dalej. SELECT (a tym samym Twoje zmienne i obliczenia) są oceniane po GRUPA WG. Aby wykonać grupowanie po obliczeniach, umieść zapytanie w podzapytaniu:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Najłatwiejszy sposób na skopiowanie bazy danych MySQL?

  2. policz liczbę zmiennych Null w wierszu mysql

  3. Wybierz kolumnę z nazwą słowa kluczowego

  4. grupuj według wartości niezerowych

  5. pobierz najnowszy wpis tekstowy oświadczenia GROUP BY