Demasiadas orden por, max, subconsultas para mi intelecto

Parece que no puedo resolver esta consulta. Estoy seguro de que necesita subconsultas, pero no tengo opciones. Mi cerebro no puede manejar esto o algo así. Necesito ayuda :)

pequeña introducción

Tengo un sitio web de apuestas. Cada 15 minutos importo las cuotas más recientes (ganar/empatar/perder, o 1/X/2) para eventos particulares de varias casas de apuestas.

Cada fila de la tabla de probabilidades tiene la odds_type ('1', 'X' o '2'), el odds_index cuál es la cuota real, la bookmaker_id y event_id.

Pero igualmente importante: created_at, porque necesito trabajar con las probabilidades de la última importación. Es muy importante por razones obvias.

Guión

En la siguiente tabla, estamos trabajando con cuotas importadas para event_id #1.

Consulta necesaria

  1. Aísle el último conjunto de cuotas importadas para event_id = 1 de todas las casas de apuestas (en este ejemplo 9 registros)
  2. En ese conjunto, devuelva el más alto odds_index grabar para odds_type '1', 'X', '2'.

Ahora prefiero hacer esto con el alcance de Rails, por lo que puedo usar @event.best_odds1 y @event.best_odds2, pero tomaré cualquier enfoque si funciona. He estado rompiendo mi cerebro en esto durante 5 días. Necesito resolverlo.

Resultado

Después de la consulta termino con 3 registros para poder mostrar "Las mejores cuotas para el evento #1".

Las mesas

Casas de apuestas

 ID  |  NAME
 ----------------------
 1   |  Unibet
 2   |  888
 3   |  Ladbrokes

Eventos

 ID  |  NAME
 --------------------------
 1   |  Holland vs Denmark
 2   |  England vs Germany
 3   |  France vs Spain

Posibilidades

 ID  |  OT  |  OI  |  BI  |  EI  |  CREATED_AT
 ---------------------------------------------------
 (first import from the bookies)
 1   |  '1'  |  2.4  |  1  |  1  |  2010-06-10 15:00
 2   |  'X'  |  1.5  |  1  |  1  |  2010-06-10 15:00
 3   |  '2'  |  6.2  |  1  |  1  |  2010-06-10 15:00
 4   |  '1'  |  2.2  |  2  |  1  |  2010-06-10 15:58
 5   |  'X'  |  1.8  |  2  |  1  |  2010-06-10 15:58
 6   |  '2'  |  5.2  |  2  |  1  |  2010-06-10 15:58
 7   |  '1'  |  2.8  |  3  |  1  |  2010-06-10 16:56
 8   |  'X'  |  1.3  |  3  |  1  |  2010-06-10 16:56
 9   |  '2'  |  7.1  |  3  |  1  |  2010-06-10 16:56
 (last import from the bookies)
 10  |  '1'  |  2.5  |  1  |  1  |  2010-06-11 17:10
 11  |  'X'  |  1.3  |  1  |  1  |  2010-06-11 17:10
 12  |  '2'  |  6.4  |  1  |  1  |  2010-06-11 17:10
 13  |  '1'  |  2.1  |  2  |  1  |  2010-06-11 18.12
 14  |  'X'  |  1.2  |  2  |  1  |  2010-06-11 18:58
 15  |  '2'  |  6.2  |  2  |  1  |  2010-06-11 18:58
 16  |  '1'  |  1.8  |  3  |  1  |  2010-06-12 14:56
 17  |  'X'  |  2.3  |  3  |  1  |  2010-06-12 14:56
 18  |  '2'  |  5.1  |  3  |  1  |  2010-06-12 14:56

Nombres de columna abreviados para que quepan en la pantalla

OT = odds_type
OI = odds_index 
BI = bookmaker_id 
EI = event_id

preguntado el 11 de junio de 12 a las 19:06

1 Respuestas

Podrías usar row_number() dos veces:

select  *
from    (
        select  *
        ,       row_number() over (partition by OT order by OI desc) as rn2
        from    (
                select  *
                ,       row_number() over (partition by EI, BI, OT 
                                           order by created_at desc) as rn1
                from    Odds
                where   EI = 1 -- for event 1
                ) sub1
        where   rn1 = 1 -- Latest row per EI, BI, OT
        ) sub2
where   rn2 = 1 -- Highest OI per OT

Pero si la mesa sigue creciendo, esto funcionará mal. Puede agregar una tabla de historial como OddsHistory y mover las probabilidades obsoletas allí. Cuando solo las cuotas más recientes están en la tabla de cuotas, su consulta se vuelve mucho más simple.

Ejemplo en vivo en SQL Fiddle.

Respondido el 11 de junio de 12 a las 20:06

Gracias, funciona de manera local en PostgreSQL 9.x, pero el proveedor de alojamiento Heroku ejecuta PostgreSQL 8.x, por lo que recibo errores al ejecutar esta consulta. Publicaré el error como un tema nuevo aqui. - Fred voluble III

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.