Então você quer:
- O alias
C
para corresponder a todas as linhas do grupo para um determinado dia, então você pode usarMAX()
eMIN()
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 aC2
no mesmo dia. Se nenhum for encontrado, ou seja,C3.*
é NULL, entãoC2
é 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;