sql >> データベース >  >> RDS >> Mysql

連続していない値を数える

    最初のクエリは次のように記述したほうがよいでしょう:

    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
    

    サブクエリではなく、必要なときに明示的に順序付けを行う方がクリーンであるだけでなく、サブクエリで順序付けを行うと、実行プランが悪くなる可能性があります(一時テーブルの場合はパフォーマンスが悪くなります)。

    最終的な結果として、GROUPBYなどを直接適用しないでください。 SELECT(したがって変数と計算)は後に評価されます GROUPBY。計算後にグループ化を行うには、クエリをサブクエリに入れます:

    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. 日時php/mysqlに30分を追加

    2. SQLコマンド

    3. MySQLコールバック-そのようなことはありますか?

    4. MySQLデバッグツールはクエリを遅くしますか?