Для этого вы можете использовать рекурсивную переменную, например:
select
@rownum:=@rownum+1 as rank,
sum(amount) as total
from
sales,
(select @rownum:=0) a
order by total desc
Чтобы получить рейтинг данного партнера, вам нужно сделать:
select
a.*,
t.rank,
t.total
from
affiliates a
inner join (
select
@rownum:=@rownum+1 as rank,
affiliate_id,
sum(amount) as total
from
sales,
(select @rownum:=0) r
group by affiliate_id
order by total desc) t on
a.affiliate_id = t.affiliate_id
where
a.affiliate_id = 342
Теперь это (относительно) медленно, потому что вам нужно каждый раз сканировать таблицу.
Если бы вы не использовали MySQL, я бы предложил подзапрос, но в целом MySQL ужасно оптимизирует подзапросы. Похоже, это будет довольно медленно для меня, но я не оценил это. В любом случае, вы можете сделать это:
select
a.*,
(select
count(*)+1
from
(select affiliate_id from sales
group by affiliate_id having sum(amount) >
(select sum(amount) from sales where affiliate_id = a.affiliate_id)))
as rank
from
affiliates a
where
a.affiliate_id = 342