Subconsultas

Senhores estou há algum tempo tentando sem sucesso.

tenho uma tabela com os campos cnpj, fatura e competência(data).

preciso de uma consulta que relacione as três últimas faturas de cada cliente.

tentei com join ou subconsultas mas não consigo retornar o resultado que desejo

esta consulta retorna todas as faturas de cada cliente, mas quando tento limitar as três ultima pelo critério de data só retorna 3 linhas

SELECT faturas.fatura, faturas.cnpj, faturas.Competencia
FROM faturas
WHERE (((faturas.cnpj) In (select cnpj from faturas)))
ORDER BY faturas.Competencia DESC;

Em Oracle seria assim

select * From (
    SELECT cnpj, fatura, rank () over(partition by cnpj order by fatura desc) as rank 
      FROM faturas 
     group by cnpj, fatura
) where rank < 4

Em mysql penso que não tens diretamente a função rank mas podes pesquisar como usar um rank em mysql.