Así que quieres:
- El alias
C
para corresponder a todas las filas en el grupo para un día determinado, por lo que puede usarMAX()
yMIN()
sobre las filas de ese grupo. - El alias
C2
para corresponder a la última fila en un día dado. - El alias
C3
para corresponder a una fila posterior aC2
En el mismo día. Si no se encuentra ninguno, es decir,C3.*
es NULL, entoncesC2
es la última de ese día.
Esto a menudo se etiqueta como greatest-n-per-group
consulta, y aparece con frecuencia en Stack Overflow. Aquí hay una solución que probé para sus datos de prueba, pero puede seguir la etiqueta que agregué a su pregunta para otras soluciones y discusión.
editar: Me perdí el requisito tanto para el precio de apertura como para el precio de cierre. Lo siguiente está 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;