Mysql
 sql >> Base de données >  >> RDS >> Mysql

Requête lente :trouver la différence entre les valeurs basées sur min et max sur une autre colonne pour chaque groupe

Si je comprends bien, vous voulez la différence entre les deux lignes les plus récentes pour chaque fix_idtype = 'avg' .

Si tel est le cas, je suggérerais des variables et une agrégation conditionnelle :

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;