3 melhores registos por equipa

16/04/2013

ola pessoal, estou a elaborar um trabalho escolar que consiste numa prova de btt. Nesse trabalho tenho de atraves de indicar qual a melhor equipa. uma equipa pode ter 1 registo como muitos mais , mas para a classificação só contam os 3 melhores, ou seja se tiver menos a equipa não entra não classificação mas se tiver mais só conta os 3 melhores. Eu consegui criar um código que soma tudo e já tem a restrição dos 3 registos, mas o problema é que eu não quero tudo só quero os 3 melhores. Alguém me consegue dar uma ajuda sff?



SELECT SUM(datediff (ms,Percurso.horaPartida,Percurso.horaChegada) ) AS tempo, Equipa.Designacao


FROM Atleta INNER JOIN
Equipa ON Atleta.idEquipa = Equipa.IdEquipa INNER JOIN
Percurso ON Atleta.idAtleta = Percurso.idAltleta INNER JOIN
Mangas ON Percurso.idMangas = Mangas.idMangas,(

SELECT Equipa.Designacao,COUNT( Equipa.Designacao) AS nElem
FROM Atleta INNER JOIN
Percurso ON Atleta.idAtleta = Percurso.idAltleta INNER JOIN
Equipa ON Atleta.idEquipa = Equipa.IdEquipa
WHERE (Percurso.horaChegada IS NOT NULL)
GROUP BY Equipa.Designacao
having COUNT( Equipa.Designacao)>2
)AS nel
where Equipa.Designacao=nel.Designacao
GROUP BY Equipa.Designacao

Order BY tempo;



Obrigado,
JALves

Jose Alves

Respostas

16/04/2013

Joel Rodrigues Currículo

Não olhei sua instrução SQL, mas acho que você pode utilizar o operador TOP para restringir a quantidade de registros. Por exemplo:
SELECT TOP 3 NOME FROM JOGADORES ORDER BY PONTUACAO DESC

Boa sorte.
Responder Citar

17/04/2013

Jose Alves

Joel Rodrigues mas assim só me dá os 3 melhores tempos independentemente da equipa. O que pretendo é 3 melhores tempos por equipa, por exemplo,

equipa 1
jogador1 10min
jogador1 10,5min
jogador2 11min

equipa 2
jogador 7 11min
jogador 7 12min
jogador 7 12,5min

Responder Citar

17/04/2013

Alex Lekao

Ola Jose, bom dia!!!

Pelo que estou percebendo provavelmente vc terá que usar um subselect para monstar o que vc precisa.

tente para ver se consegue algo.

Abraco.

Alex - Lekao
Responder Citar

02/05/2013

Jose Alves

Boa tarde , isso eu já tentei fazer e não consegui, até ao momento o melhor que tenho é o código acima defenido.
Responder Citar

17/08/2013

José

Olá amigo José, teve algum avanço em relação a sua duvida, que possa compartilhar conosco ?
Responder Citar

17/08/2013

José

olá amigo josé, teve algum avanço em relação a sua duvida, que possa compartilhar conosco ?

Obrigado.
Responder Citar

18/08/2013

Jose Alves

sim, a solução estava no cross apply

fica aqui um exemplo do meu caso

SELECT e.designacao AS designacao, SUM(t.Tempo) AS temp
        FROM Equipa e
                CROSS APPLY 
                        (SELECT TOP 3 datediff (ms,te.horaPartida ,te.horaChegada) AS tempo FROM Percurso te, Atleta at,dbo.ContarPercurso CNT WHERE te.idAltleta =at.idAtleta AND at.idEquipa=e.IdEquipa AND at.idEquipa=CNT.EquipaID ORDER BY Tempo ASC) AS t

        GROUP BY e.designacao
ORDER BY SUM(t.Tempo) ASC
Responder Citar

19/08/2013

Alex Lekao

Cross Apply...

isso eu nao conheco e nem tinha ouvido falar, interessante... pesquisar a respeito... rsrsr

obrigado.

Abraco.

Alex - Lekao
Responder Citar

19/08/2013

José

Obrigado pelo retorno Jose, e por compartilhar a solução conosco.
Sendo assim estou finalizando o tópico.

TÓPICO CONCLUÍDO.
Responder Citar