Selecionar ultimas 4 ocorrências de cada ano, por estado
Boa tarde a todos, estou com uma dúvida talvez besta para alguns, se puderem ajudar agradeço muito.
Para as duas questões a seguir, considere o seguinte banco de dados:
TIME (id, nome, estado)
CAMPEONATO (id, nome, ano_realizacao)
RESULTADO (id_time, id_campeonato, pontos)
>
Citar
1- Faça uma query SQL que retorne a lista dos times que se classificaram para a Libertadores nos últimos 5 anos. Os 6 primeiros times do campeonato se classificam para a Libertadores. Os resultados devem aparecer em ordem decrescente, ordenados por ano de realização do torneio e classificação final do time.
Essa resulvi, porém usando 5 UNION:
(select * from resultado r where r.id_campeonato = ( select id from campeonato where ano_realizacao = YEAR(now())-1) order by pontos desc limit 6)
union
(select * from resultado r where r.id_campeonato = ( select id from campeonato where ano_realizacao = YEAR(now())-2) order by pontos desc limit 6)
union
(select * from resultado r where r.id_campeonato = ( select id from campeonato where ano_realizacao = YEAR(now())-3) order by pontos desc limit 6)
union
(select * from resultado r where r.id_campeonato = ( select id from campeonato where ano_realizacao = YEAR(now())-4) order by pontos desc limit 6)
union
(select * from resultado r where r.id_campeonato = ( select id from campeonato where ano_realizacao = YEAR(now())-5) order by pontos desc limit 6)
Ja a segunda pede os ultimos 30 anos.
>
Citar
2- Faça uma query SQL que retorne o número de equipes rebaixadas, por estado, nos últimos 30 anos. Os 4 últimos colocados do campeonato são rebaixados todo ano.
Consigo fazer assim:
select count(DISTINCT result.id) as 'Quantidade', result.* FROM
(
(select r.*, t.estado from resultado r, time t where r.id_time = t.id AND r.id_campeonato = ( select id from campeonato where ano_realizacao = YEAR(now())-1) order by pontos limit 2)
union
(select r.*, t.estado from resultado r, time t where r.id_time = t.id AND r.id_campeonato = ( select id from campeonato where ano_realizacao = YEAR(now())-2) order by pontos limit 2)
union
(select r.*, t.estado from resultado r, time t where r.id_time = t.id AND r.id_campeonato = ( select id from campeonato where ano_realizacao = YEAR(now())-3) order by pontos limit 2)
#... AQUI TERIA QUE COLOCAR MAIS 27 UNION SELECT
)
as result group by estado
Teria como fazer sem usar 30 UNION ? lembrando que estou usando o MySQL.
Desde já agradeço.
Discussão (1)
Carregando comentários...