none
Consulta SQL seleccionar los tres mejores tiempos por cada equipo RRS feed

  • 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.
    lunes, 27 de noviembre de 2017 14:28

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

    lunes, 27 de noviembre de 2017 21:26
  • 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

    martes, 28 de noviembre de 2017 14:02
  • 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

    martes, 28 de noviembre de 2017 15:16
  • Adjunta por favor el código como texto, no como imagen, la imagen sirve sólo como referencia.
    martes, 28 de noviembre de 2017 15:22
  • 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


    <link href="moz-extension://629bb10a-89f4-4d4d-8d30-2795b3f3f63e/skin/s3gt_tooltip_mini.css" rel="stylesheet" type="text/css" /><style media="print" type="text/css">#s3gt_translate_tooltip_mini { display: none !important; }</style>

    martes, 28 de noviembre de 2017 15:46
  • 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

    martes, 28 de noviembre de 2017 22:54
  • 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
    miércoles, 29 de noviembre de 2017 18:26
  • 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
    miércoles, 29 de noviembre de 2017 18:38