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

遅いクエリ:各グループの別の列の最小値と最大値に基づいて値の差を見つけます

    私が正しく理解していれば、各fix_idの最新の2行の違いが必要です。 ここで、type = 'avg'

    もしそうなら、私は変数と条件付き集計を提案します:

    select fix_id,
           max(case when rn = 1 then odds end) as odds,
           max(case when rn = 1 then market end) as market,
           max(case when rn = 1 then away end) as away,
           sum(case when rn = 1 then odds when rn = 2 then - odds end) as diff,
           max(type) as type
    from (select ao.*,
                 (@rn := if(@f = fix_id, @rn + 1,
                            if(@fn := fix_id, 1, 1)
                           )
                 ) as rn
          from (select ao.*
                from average_odds ao
                where type = 'avg'
                order by ao.fix_id, ao.updated desc
               ) ao cross join
               (select @f := -1, @rn := 0) params
         ) ao
    where rn <= 2
    group by fix_id;
    


    1. mysqlで、結合する行の数を制限します

    2. SQL ServerのFORMAT()でサポートされているカスタムの日付/時刻形式の文字列

    3. SQLiteの日付に月を追加する

    4. より効率的なものは何ですか?SQLデータベースまたはファイルにログを保存しますか?