Usuario
Consulta SQL seleccionar los tres mejores tiempos por cada equipo

Pregunta
-
Buen día estoy trabajando en un programa para registrar los resultados de una competición, necesito obtener los tres mejores tiempos de cada equipo participando en la prueba, los equipos pueden tener todos los corredores que quieran participando pero sólo serán tomados en cuenta los primeros tres mejores tiempos de cada equipo los cuales se sumarán para tener el tiempo total del equipo, si del equipo finalizan dos o menos corredores dejarán de ser un equipo y no se tomarán en cuenta como tal para esa clasificación por lo tanto la consulta que genere debe considerar recoger únicamente los tiempos de los equipos que tengan al menos tres corredores que hayan finalizado y su tiempo sea mayor que 00:00:01 o sea que en la lista de resultados tengan algún tiempo ya que podrían aparecer como corredores que no iniciaron la competencia, que no la finalizaron o que fueron descalificados.
1 42 FERNANDEZ Jose
SHIMANO
04:03:12 04:03:12 2 45 RUIZ Marco SHIMANO 04:03:42 +30 3 43 RODRIGUEZ Josue Alberto SHIMANO
04:03:55 +43 4 8 VILLA Jose MUNICIPAL 04:06:17 +03:05 5 47 CALDERA Edwin Martin SHIMANO
04:11:00 +07:48 6 46 CHAVEZ Felipe MUNICIPAL 04:11:54 +08:42 7 68 UMAÑA Omar MUNICIPAL 04:21:26 +18:14 8 33 DAVILA DANIEL CARROCERIAS 04:21:26 +18:14 9 4 VEGA JUIOR
CARROCERIAS
04:26:57 +23:45 10 26 JUAREZ Manuel Alberto COMIDAS RAPIDAS
04:26:57 +23:45 11 3 CARMONA Reyner Steven CARROCERIAS 04:26:57 +23:45 12 88 FALLAS Steven COMIDAS RAPIDAS
04:26:58 +23:46 13 44 PADILLA Jeancarlo SHIMANO
04:27:00 +23:48 14 6 ARCE Pablo CARROCERIAS 04:27:24 +24:12 15 87 REYES Harvin Manuel TREK 04:30:35 +27:23
89 QUESADA Jorge Alejandro TREK DNF
90 ACOSTA José TREK DNF
23 CORREDERA Jose Miguel CARROCERIAS DNF
48 GAMBOA Andres COMIDAS RAPIDAS
DNF
2 ROJAS Luis Daniel COMIDAS RAPIDAS
DNS
18 ARTAVIA Cristian PINTURAS ARTE
DNS
70 VILLANUEVA Nathaniel PINTURAS ARTE
DSQ La tabla Resultados contiene la información siguiente:
Tabla_Resultados
Posicion, Dorsal, Nombre_Corredor, Nombre_Equipo, Tiempo, Codigo_Evento además de otros campos que no importan para generar la consulta requerida. Tengo la idea de como plantear la consulta pero no la sintaxis correcta de MySql que es la base de datos que utilizo, mi idea es la siguiente:
Select Distintc Nombre_Equipo y luego contar los tres primeros tiempos de ese equipo si al menos hay tres corredores con tiempo, si se puede sumarlos de una vez para luego pasar esa información a una tabla de resultados de equipos.
Select Distintc Nombre_Equipo from Select Count (Nombre_Equipo) >= 3 limit 3 Where Codigo_Evento = 'Codigo del Evento'
Esa es mi idea, se que la sintaxis no es la correcta y por eso necesito de su ayuda para estructurarla correctamente, si puediera obtener la información de los tres corredores de cada equipo sería excelente, en realidad lo que necesito puedo hacerlo realizando consultas paso por paso pero lo que necesito es ver la posibilidad de realizarlo en una consulta más eficiente.
Desde ya muchas gracias.
Frank Cruz
- Editado Frank Jarquin lunes, 27 de noviembre de 2017 14:31
- Cambiado Enrique M. Montejo martes, 28 de noviembre de 2017 8:05 Pregunta relacionada con el acceso a datos con MySql.
Todas las respuestas
-
Buenas DANE no entendí muy bien lo que hace el código, porque al final selecciona de todo inclusive hasta los corredores DNS, DNF o sin Tiempo, recoge la información de todos los corredores sin importar sin son uno, dos o más inclusive siete, le agregué únicamente las condiciones para que se ejecutara en el workbenche, le adjunto la imagen del resultado
Frank Cruz
-
Buen día DANE ya hice la corrección para no incluir los DNF y demás corredores sin tiempo pero al final no entiendo que es lo que hace la consulta porque me retorna todos los corredores y no los primeros tres de cada equipo o sea si tiene siete corredores me retorna los siete y si solo tiene uno también es como si hiciera un select de todos los corredores que tienen tiempo y yo solo necesito que me devuelva la información de los tres primeros corredores de cada equipo con la condición de que sean al menos tres corredores, si tienen uno o dos no los tomo en cuenta, tampoco tomo en cuenta los corredores 4,5,6, etc si el equipo tiene más de tres corredores, sólo interesan los primeros tres tiempos de cada equipo.
Frank Cruz
-
Esto es lo más cercano que tengo en este momento, con esta consulta logro obtener en orden los tiempos de cada corredor agrupados por equipos, necesito incluirle a la consulta un contador que me restrinja a solo tres corredores por equipo. Con esta consulta logro ordenarlos por equipo, tiempo y posicion pero me interesa reducir a tres por equipo el resultado de la consulta.
Frank Cruz
-
-
Gracias Willams adjunto el código de hecho me dí cuenta que el distinct no estaba haciendo ninguna función.
SELECT Nombre_Equipo, posicion , nombre_ciclista, tiempo FROM resultados
WHERE categoria = 'ELITE MASCULINO' and Codigo_Evento = 'VCEMEX-2017' AND Tiempo <> 'DNF'
AND Tiempo <> 'DNS' AND TIEMPO <> 'DSQ' order by Nombre_Equipo, CAST(posicion as unsigned) asc;
Frank Cruz
- Editado Frank Jarquin martes, 28 de noviembre de 2017 15:50
-
El código anterior está mejor al menos selecciona los tres primeros corredores de cada equipo pero también toma en cuenta a los que tienen dos o un corredor que no deberían ser tomados en cuenta, debería haber un contador de Nombre_Equipo y sí contador = 3 entonces seleccionar la información de esos tres corredores. De esta forma no tomaria en cuenta si tienen uno o dos corredores.
Frank Cruz
-
Trata:
with E as (
select distinct nombre_equipo, codigo_evento
from tabla_resultados
where codigo_evento = 'VCEMEX-2017'
)
select E.*, D.*
from E cross apply (
select top(3) nombre_corredor, posicion
from tabla_resultados as R
where R.codigo_evento = E.codigo_evento and R.nombre_equipo = E.nombre_equipo
order by cast(posicion int) asc
) as D;Tambien puedes usar una funcion de rango (ranking function).
with R as (
select nombre_equipo, codigo_evento, posicion, nombre_corredor, row_number(partition by codigo_evento, nombre_equipo) over(order by cast(posicion as int)) as rn
from tabla_resultados
where codigo_evento = 'VCEMEX-2017'
)
select *
from R
where rn < 4;
AMB
Some guidelines for posting questions...
AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas- Editado HunchbackMVP miércoles, 29 de noviembre de 2017 18:29
-
Buenas Hunchback la palabra reservada With no me funciona o no me la reconoce MySql, al menos no me lo acepta en esa posición.
Frank Cruz
- Editado Frank Jarquin miércoles, 29 de noviembre de 2017 18:48