Jeśli dobrze rozumiem, chcesz różnicę między dwoma najnowszymi wierszami dla każdego fix_id
gdzie type = 'avg'
.
Jeśli tak, proponowałbym zmienne i agregację warunkową:
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;