Я думаю, что наиболее общий метод состоит в том, чтобы перечислить значения с помощью переменных:
select t.*
from (select t.*,
(@rn := if(@f = t.firm, @rn + 1,
if(@f := t.firm, 1, 1)
)
) as rn
from mytable t cross join
(select @f := '', @rn := 0) params
order by t.firm, t.year desc
) t
where rn = 2;
Ваша версия имеет фатальный недостаток: она использует group by
с select *
. В выборке есть неагрегированные столбцы, которые не являются ключами group by
. Это неработающий SQL, который не будет работать практически в любой базе данных и использует настройки по умолчанию в более поздних версиях MySQL.
Если предполагается, что «n» - это число лет до последнего года (ну, смещение на 1), тогда объединения могут работать:
select t.*
from mytable t join
(select firm, max(year) as max_year
from mytable
group by firm
) f
on t.firm = f.firm and t.year = f.max_year - (2 - 1);