Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Compare linhas na mesma tabela no mysql


Você pode realizar uma "auto-junção" (unindo a tabela a ela mesma) para realizar consultas. A parte complicada aqui é saber a ordem em que as linhas foram inseridas na tabela e apenas comparar as linhas que são sequencialmente (temporariamente) adjacentes. Estou assumindo que você tem algum tipo de coluna TIMESTAMP que lhe dirá quais mudanças de preço vieram após as anteriores. Caso contrário, talvez "ID" possa informá-lo disso (a linha de ID maior sendo inserida após a ID menor).

Chamando sua tabela de 'TAB', usando 'TRADER' para fornecer a junção e usando 'ID' para fornecer o pedido, a consulta exigiria uma junção automática de três vias, como segue:
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

A consulta acima une a tabela a si mesma duas vezes para que cada guia represente o seguinte:
  • tab a :a linha mais recente para comparação
  • tab b :a linha imediatamente anterior para comparação
  • tab c :uma linha entre a e b no sentido horário (não deve existir)

Realizamos um LEFT OUTER JOIN para 'tab c' porque na verdade não queremos que essa linha exista. Na cláusula where, filtramos nossos resultados apenas para os resultados em que não existe uma linha 'tab c'.

Finalmente, a consulta executa um 'GROUP BY' no trader e SUM()s os Incrementos e Decrementos comparando o preço das linhas 'a' e 'b'.

Este foi um desafio divertido. Espero que isto ajude!

João...