Se a necessidade fosse identificar o penúltimo ID de compra, você poderia fazer um subselect. Se a tabela for grande, isso impacta em desempenho. Exemplo:
select CA.numero_cartao,
(select id from compra where id_cartao = CA.id ORDER BY id DESC LIMIT 1 ,1) as penultimo
from cartao as CA
group by CA.numero_cartao, CA.id
Caso você queira todos os dados da compra, seria melhor gravar estes resultados numa tabela e usar ela para fazer a seleção. Exemplo:
SELECT * from compra co
inner join cartao ca on ca.id = co.id_cartao
where co.id in (select codigos from tabela_penultimos)
Você até pode tentar fazer tudo de uma vez, mas creio que o desempenho não ficaria bom. Eu não recomendo, mas seria algo assim:
SELECT * from compra co
inner join cartao ca on ca.id = co.id_cartao
where co.id in (
select
(select id from compra where id_cartao = CA.id ORDER BY id DESC LIMIT 1 ,1)
from cartao as CA
group by CA.numero_cartao, CA.id
) tabela