Mis tablas son:

Jugadores: Nombre – Mano – Teléfono

Actuaciones: Nombre – TName – Puntuación

Torneos: TName – TDate

Estoy tratando de averiguar cómo calcular la diferencia en la puntuación de un jugador llamado Fred. Mi código hasta el momento es:

select tname, tdate, score
from tournaments
natural inner join 
performances
where bname = 'Fred'
order by tdate;

Esto me da una tabla como esta:

 TName                    TDate                Score
 ------------------------ ------------ -------------
 Tournament 1             1/1/2014               250
 Tournament 2             1/8/2014               245
 Tournament 3             2/10/2014              215

Ahora solo tengo que añadir una cuarta columna en la que se calcula la diferencia en su cuenta desde el torneo anterior. Por lo que el acabado de la tabla quedaría así:

 TName                    TDate                Score     Score_Dif
 ------------------------ ------------ ------------- -------------
 Tournament 1             1/1/2014               250             0
 Tournament 2             1/8/2014               245            -5
 Tournament 3             2/10/2014              215           -30

Cualquier ayuda es muy apreciada!

InformationsquelleAutor user3407345 | 2014-03-11

2 Comentarios

  1. 1

    SQLPlus es generalmente asociado a Oracle, que apoya la lag() función. Así, usted puede hacer lo que quiera con bastante facilidad:

    select tname, tdate, score,
           coalesce(score - lag(score) over (order by tdate), 0) as diff
    from tournaments natural inner join 
         performances
    where bname = 'Fred'
    order by tdate;
    • Ah no importa, sólo tenía que cambiar a «tdate» ¡muchas gracias! No podía recordar la función lag, que ayudó un montón!
  2. 0

    Suponiendo que usted está trabajando con MySQL:

    Puede usar una variable temporal para mantener el valor anterior y, a continuación, se puede calcular la diferencia. Echa un vistazo a esta pregunta y sus aceptado respuesta.

    Para su propósito específico, me gustaría crear una tabla temporal para almacenar los datos, y luego me iba a la consulta de que la tabla temporal y calcular las diferencias:

    drop table if exists temp_data;
    create temporary table temp_data
        select 
            tname, tdate, score
        from 
            tournaments
            natural inner join performances
        where 
            bname = 'Fred';
    alter table temp_data
        add index idx_tname(tname),
        add index idx_tdate(tdate);
    select tname, tdate, score, score_dif
    from
        (
            select 
                tname, tdate, 
                @prevScore as previousScore, 
                a.score - @prevScore as score_dif, 
                @prevScore := a.score as score
            from
                (
                    select @prevScore := 0
                ) as init,
                temp_data as a
            order by a.tdate
        ) as calcQuery;

    Espero que esto ayude.

    • Ok, puedes colocar esta respuesta (que no están usando MySQL). La próxima vez por favor, etiqueta a tu pregunta correctamente
    • Pido disculpas, he probado a cambiar tan pronto como he publicado pero he cagado.

Dejar respuesta

Please enter your comment!
Please enter your name here