Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Langsame Abfrage:Finden Sie den Unterschied zwischen Werten basierend auf Min und Max in einer anderen Spalte für jede Gruppe

Wenn ich das richtig verstehe, möchten Sie die Differenz zwischen den beiden neuesten Zeilen für jede fix_id wobei type = 'avg' .

Wenn ja, würde ich Variablen und bedingte Aggregation vorschlagen:

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;