Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Contar apariciones dentro de serie

Estas en el tema de Contar apariciones dentro de serie en el foro de Mysql en Foros del Web. Estimados... voy a tratar de explicarme lo mejor posible. Tengo una tabla con resultados de equipos de futbol. Las posibilidades son que cada equipo haya ...
  #1 (permalink)  
Antiguo 27/03/2014, 07:16
 
Fecha de Ingreso: junio-2008
Mensajes: 122
Antigüedad: 15 años, 10 meses
Puntos: 1
Contar apariciones dentro de serie

Estimados... voy a tratar de explicarme lo mejor posible.

Tengo una tabla con resultados de equipos de futbol.
Las posibilidades son que cada equipo haya ganado, empatado o perdido.

Lo que estoy necesitando es saber cual fue la mayor serie de victorias o derrotas.

O sea... supongamos que cuando el equipo gana tiene valor 3, cuando pierde el valor es 0 y cuando empata el valor es 1.

Yo tendria algo asi:
id_equipo 3 3 0 1 3 3 3 3 3 0 0 0 0 1
Eso significa que el primer partido lo gano, el tambien, el tercero lo perdio... etc.
La mayor serie de victorias seria 5 porque tengo 5 veces seguidas el numero 3.
En cambio la mayor serie de derrotas seria 4 porque tengo 4 veces seguidas el 0.
Se entiende?

Ahora la pregunta... como hago esto con MySQL?
Hay alguna funcion para contar series?

Saludos...
  #2 (permalink)  
Antiguo 27/03/2014, 14:13
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Contar apariciones dentro de serie

Algo como:
Código MySQL:
Ver original
  1.     id_equipo,
  2.     SUM(IF(puntos = 3, 1, 0)) Ganados,
  3.     SUM(IF(puntos = 1, 1, 0)) Empatados,
  4.     SUM(IF(puntos = 0, 1, 0)) Perdidos
  5. FROM equipos_partidos
  6. GROUP BY id_equipo
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 27/03/2014, 17:23
 
Fecha de Ingreso: junio-2008
Mensajes: 122
Antigüedad: 15 años, 10 meses
Puntos: 1
Respuesta: Contar apariciones dentro de serie

Si, ya lo pense pero eso me daria el total de partidos ganados, empatados y perdidos agrupado por equipo.

Yo en realidad lo que necesito es que me diga cual es la mayor serie de partidos ganados.

De acuerdo al ejemplo anterior, la respuesta deberia ser 5 porque es la mayor serie de partidos ganados.

Se entiende? Alguna idea?
  #4 (permalink)  
Antiguo 27/03/2014, 17:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Contar apariciones dentro de serie

Define "serie".

¿Qué diferencia una "serie" de un "partido"? ¿CUál es el discriminante de "serie"?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 28/03/2014, 13:15
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Contar apariciones dentro de serie

Hola lucianomdq:

Creo que tenemos un problema de lenguaje, en este basto idioma español .

Si entendí, lo que te refieres con "serie" sería lo mismo que al número de partidos continuos o seguidos que un equipo gana, o lo que es lo mismo una "racha" o una "seguidilla" o partidos ganados "en fila"... (lo que en inglés llaman 'Streak')... si estoy en lo correcto, se me ocurren algunas formas para obtener la consulta, sin embargo, como tienes tu información, no es suficiente... Necesariamente necesitas darle un "orden" a tus datos... es decir, ¿cómo sé qué 3 va antes de qué otro 3? En primer lugar necesitas un orden para tus datos... supongamos que tienes un campo id (o fecha, o consecutivo, lo que sea), más o menos así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+-------------+--------+
  3. | id   | equipo      | puntos |
  4. +------+-------------+--------+
  5. |    1 | Real Madrid |      3 |
  6. |    1 | Real Madrid |      3 |
  7. |    2 | Real Madrid |      0 |
  8. |    3 | Real Madrid |      1 |
  9. |    4 | Real Madrid |      3 |
  10. |    5 | Real Madrid |      3 |
  11. |    6 | Real Madrid |      3 |
  12. |    7 | Real Madrid |      3 |
  13. |    8 | Real Madrid |      3 |
  14. |    9 | Real Madrid |      0 |
  15. |   10 | Real Madrid |      0 |
  16. |   11 | Real Madrid |      0 |
  17. |   12 | Real Madrid |      0 |
  18. |   13 | Real Madrid |      1 |
  19. +------+-------------+--------+
  20. 14 rows in set (0.00 sec)

Entonces, una forma para obtener las "series" o rachas de partidos ganados, es determinar cuando inicia la racha y cuando termina la racha... con los datos de ejemplo de arriba, hay una racha que comienza en la fecha 1 (id = 1) y termina en la fecha 2 (id=2), por lo tanto, la "duración" de la racha es de 2-1 = 1 partidos...

ahora bien, hay otra racha que comienza en la fecha 4 (id = 4) y termina hasta la fecha 9 (id=9)... esto quiere decir que la "serie" de partidos ganados es de 9 - 4 = 5 partidos...

Ahora bien, con esta idea, puedes hacer una consulta más o menos así:

Código MySQL:
Ver original
  1. mysql>  SELECT T1.equipo, T1.id inicio_racha, MIN(T2.id) fin_racha
  2.     ->  FROM tabla T1
  3.     ->  INNER JOIN
  4.     ->  tabla T2 ON T1.equipo = T2.equipo AND T2.id > T1.id AND
  5.     ->  T2.puntos IN (0, 1)
  6.     ->  WHERE t1.puntos = 3
  7.     ->  GROUP BY T1.equipo, T1.id
  8.     ->  ORDER BY T1.equipo, T1.id, T2.id;
  9. +-------------+--------------+-----------+
  10. | equipo      | inicio_racha | fin_racha |
  11. +-------------+--------------+-----------+
  12. | Real Madrid |            1 |         2 |
  13. | Real Madrid |            4 |         9 |
  14. | Real Madrid |            5 |         9 |
  15. | Real Madrid |            6 |         9 |
  16. | Real Madrid |            7 |         9 |
  17. | Real Madrid |            8 |         9 |
  18. +-------------+--------------+-----------+
  19. 6 rows in set (0.00 sec)

Lo que haces básicamente es buscar el id de inicio de la racha y el id del fin de la racha... es necesario entonces buscar el primer registro (MIN(id)) posterior que no se haya ganado (T2.id > T1.id and T2.puntos IN (0, 1))

Con esta consulta puedes obtener la duración de las series y sacar el mayor.

Dale una revisada a la consulta, espero que te sirva.

Saludos
Leo.
  #6 (permalink)  
Antiguo 28/03/2014, 16:41
 
Fecha de Ingreso: diciembre-2005
Mensajes: 65
Antigüedad: 18 años, 4 meses
Puntos: 4
Respuesta: Contar apariciones dentro de serie

Yo emplearia dist into de 3. Otra cosa es que haces LA Consulta recorriendo due abajo a arriba con lo que necesitas el ultimo registro, es mass sencillo due arriba hacia abajo con lo que conoces el primer registro. Esto es porque LA Consulta esta mal ya que no funcionaria con 013333 poor ejemplo.

Estos teclados due movil...
  #7 (permalink)  
Antiguo 28/03/2014, 17:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Contar apariciones dentro de serie

Considerado así, como secuencia de numeros repetidos en el orden de entrada, es posible hacerlo, pero es un caso complicado...
Para hacerlo en MySQL se necesita usar variables de usuario de MySQL, y más de una.
No te lo recomiendo, no porque no sea bueno, sino que es algo complicado para los que recién se inician.
Probablemente sea más sencillo hacerlo con cursores, pero en ese caso sería igual que hacerlo programáticamente.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 29/03/2014, 17:47
 
Fecha de Ingreso: junio-2008
Mensajes: 122
Antigüedad: 15 años, 10 meses
Puntos: 1
Respuesta: Contar apariciones dentro de serie

Estimados, muchas gracias por sus respuestas.
Creo que con la respuesta de leonardo_josue voy a estar.
De todas maneras mi inquietud estaba mas orientada a hacer esto simplemente con una consulta... por si existia alguna funcion para hacerlo.
Otra posibilidad es hacerlo directamente con php pero antes quise ver si hay otra forma desde la consulta.
De todas maneras muchas gracias a todos por sus sugerencias.

Etiquetas: serie, sql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:32.