sql >> Base de Datos >  >> RDS >> Mysql

Comparar filas en la misma tabla en mysql

Puede realizar una "autounión" (unión de la tabla a sí misma) para realizar consultas. La parte complicada aquí es saber el orden en que se insertaron las filas en la tabla y solo comparar las filas que son secuencialmente (temporalmente) adyacentes. Supongo que tiene algún tipo de columna TIMESTAMP que le dirá qué cambios de precio se produjeron después de los anteriores. De lo contrario, tal vez "ID" pueda informarle de eso (la fila de ID mayor se inserta después de la ID menor).

Al llamar a su tabla 'TAB', usar 'TRADER' para proporcionar la unión y usar 'ID' para proporcionar la orden, la consulta requeriría una autounión de tres vías como la siguiente:

SELECT a.trader
     , SUM(IF(a.price > b.price, 1, 0)) nbr_incr
     , SUM(IF(a.price < b.price, 1, 0)) nbr_decr
     , SUM(IF(a.price = b.price, 1, 0)) nbr_same
  FROM tab a
  JOIN tab b 
    ON a.trader = b.trader AND a.id > b.id
  LEFT OUTER JOIN tab c 
    ON a.trader = c.trader AND a.id > c.id AND b.id < c.id
 WHERE c.id IS NULL
 GROUP BY a.trader

La consulta anterior une la tabla consigo misma dos veces para que cada pestaña represente lo siguiente:

  • pestaña a:la fila más reciente para comparar
  • pestaña b:la fila inmediatamente anterior para comparar
  • pestaña c:una fila entre a y b en el tiempo (no debería existir)

Realizamos un LEFT OUTER JOIN a 'tab c' porque en realidad no queremos que exista esa fila. En la cláusula where, filtramos nuestros resultados solo a los resultados donde no existe una fila 'tab c'.

Finalmente, la consulta realiza un 'GROUP BY' en el comerciante y SUM() los Incrementos y Decrementos comparando el precio de las filas 'a' y 'b'.

Este fue un desafío divertido. ¡Espero que esto ayude!

Juan...