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

Como usar o Group By e o self-join para retornar o conjunto de resultados diários de preço mínimo, máximo, aberto e fechado?


Então você quer:
  • O alias C para corresponder a todas as linhas do grupo para um determinado dia, então você pode usar MAX() e MIN() sobre as linhas desse grupo.
  • O alias C2 para corresponder à última linha em um determinado dia.
  • O alias C3 para corresponder a uma linha posterior a C2 no mesmo dia. Se nenhum for encontrado, ou seja, C3.* é NULL, então C2 é o mais recente naquele dia.

Isso geralmente é rotulado como greatest-n-per-group query, e aparece com frequência no Stack Overflow. Aqui está uma solução que testei para seus dados de teste, mas você pode seguir a tag que adicionei à sua pergunta para outras soluções e discussões.

editar: Eu perdi o requisito tanto para o preço de abertura quanto para o preço de fechamento. O seguinte é editado.
SELECT DATE_FORMAT(C.`DTE`, '%m/%d/%Y') AS trading_day, 
  MIN(C.`PRICE`) AS min_price, 
  MAX(C.`PRICE`) AS max_price, 
  Copen.`PRICE` AS opening_price,
  Cclose.`PRICE` AS closing_price 
FROM `CHART_DATA` AS C 
INNER JOIN `CHART_DATA` AS Cclose 
  ON DAY(C.`DTE`) = DAY(Cclose.`DTE`) 
LEFT OUTER JOIN `CHART_DATA` AS Cclose_later 
  ON DAY(C.`DTE`) = DAY(Cclose_later.`DTE`) AND Cclose.`DTE` < Cclose_later.`DTE`
INNER JOIN `CHART_DATA` AS Copen 
  ON DAY(C.`DTE`) = DAY(Copen.`DTE`) 
LEFT OUTER JOIN `CHART_DATA` AS Copen_earlier 
  ON DAY(C.`DTE`) = DAY(Copen_earlier.`DTE`) AND Copen.`DTE` < Copen_earlier.`DTE`
WHERE Cclose_later.`DTE` IS NULL AND Copen_earlier .`DTE` IS NULL 
GROUP BY trading_day;