Så du vil have:
- Aliaset
Cfor at svare til alle rækker i gruppen for en given dag, så du kan brugeMAX()ogMIN()over rækkerne i den gruppe. - Aliaset
C2for at svare til den sidste række på en given dag. - Aliaset
C3at svare til en række senere endC2samme dag. Hvis ingen findes, dvs.C3.*er NULL, derefterC2er den seneste på den dag.
Dette er ofte mærket som en greatest-n-per-group forespørgsel, og den kommer ofte op på Stack Overflow. Her er en løsning, som jeg testede for dine testdata, men du kan følge tagget, jeg tilføjede til dit spørgsmål, for andre løsninger og diskussion.
rediger: Jeg savnede kravet til både åbningskurs og lukkekurs. Følgende er redigeret.
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;